2012-03-16 19 views
13

Per qualsiasi motivo, le sessioni non funzionano nella mia app Silex. Ho impostato error_reporting nel mio php.ini su E_ALL | E_STRICT e gli errori vengono visualizzati e registrati. Niente da vedere lì. Ma per qualche motivo non viene creata alcuna sessione e non c'è alcun file in /project-root/tmp/sessions/ (e anche no, quando si usa il percorso predefinito session.save). Passando a PdoSessionStorage, per escludere problemi con permessi di lettura/scrittura sul filesystem, non ha portato risultati. Ho anche provato a passare tra $app['session'], $request->getSession() e $app['request']->getSession() inutilmente.Le sessioni non funzionano in Silex App

Sono ad una perdita quanto a dove altro cercare i problemi ...

Ecco un test molto semplice-app che ho scritto (use è omesso per risparmiare spazio). Fondamentalmente questo test mostra ciò che cerco di ottenere nella mia app vera e propria. Voglio memorizzare un array nella sessione. In $app->before() controllo se il valore è impostato e quindi lo passiamo al ramoscello per essere visualizzato, ad es. informazioni di login: You are logged in as {{ user.name }}:

$app = new Application; 
$app['debug'] = true; 
$app->register(new SessionServiceProvider, array(
    'session.storage.save_path' => dirname(__DIR__) . '/tmp/sessions' 
)); 
$app->register(new TwigServiceProvider, array(
    'twig.path' => __DIR__ . '/views' 
)); 

$app->before(function (Request $request) use ($app) { 
// if ($app['debug'] == true) { 
//  $request->getSession()->set('test', array('key' => 'value')); 
// } 
    if ($request->hasPreviousSession() && $request->getSession()->has('test')) { 
     $test = $request->getSession()->get('test'); 
     if ($test !== null) { 
      $app['twig']->addGlobal('before', $test); 
     } 
    } 
}); 

$app->get('/', function() use ($app) { 
    return $app['twig']->render('sessiontest.twig'); 
}); 
$app->get('/test', function() use ($app) { 
    $app['session']->set('test', array('key' => 'value')); 
    return $app['twig']->render('sessiontest.twig', 
     array('get' => $app['session']->get('test'))); 
}); 
$app->run(); 

sessiontest.twig assomiglia a questo:

<html> 
<head><title>test</title></head> 
<body> 
    {% if before is defined %}before: {{ before.key }}{% endif %} 
    {% if get is defined %}get: {{ get.key }}{% endif %} 
</body> 
</html> 

Quando si va a/non viene visualizzato nulla, quando si va a/test solo "ottenere: test" viene visualizzato (ma non effettivamente memorizzati, in quanto né tornare a/né inneschi di aggiornamento prima).

+2

Si prega di provare ad aggiungere questo in cima: '$ app-> prima (funzione ($ richiesta) {$ request-> getSession() -> start();});' – igorw

+0

@igorw Grazie, che ha fatto il trucco . Non ho visto il legno per gli alberi, immagino. Sono così abituato alla sessione avviata dietro le quinte da lavorare con Zend Framework, che non ho nemmeno pensato di avviarla manualmente, – dbrumann

+0

Lasciatemi postare nuovamente questa risposta come risposta. – igorw

risposta

26

In questo momento è necessario avviare la sessione manualmente:

$app->before(function ($request) { 
    $request->getSession()->start(); 
}); 

Non ci sono biglietti su questo nel inseguitore selce, non ho avuto il tempo di pensarci ancora. Il problema è che se lo fai, farai una sessione per ogni utente. Ogni utilizzo di una sessione, significa che ogni utente riceve i cookie. Qualcosa che potresti non volere. Qual è il motivo per cui non viene avviato automaticamente a questo punto.

Spero che chiarisca un po 'le cose.

+0

Nel mio scenario usare una sessione per ogni utente è accettabile, quindi non mi dispiace. Grazie ancora, sia per la risposta che per il chiarimento. – dbrumann

+5

Si prega di aggiungere questo ai documenti Silex! Ho appena trascorso un'ora spelunking attraverso il codice Symfony Session cercando di capirlo. – yitznewton

+0

@igorw, silex è ancora interessato da questo problema? – Federkun

Problemi correlati