web-dev-qa-db-fra.com

Laravel les données de session ne collent pas lors des chargements de page

J'ai essayé d'exécuter le code suivant:

Session::put('progress', '5%');

dd(Session::get('progress'));

Cela montrera '5%' dans le dump.

Si je réexécute la même page mais commente Session::put('progress', '5%'); afin que seule la ligne dd() soit appelée, j'obtiens une valeur null au lieu des 5% enregistrés dans le chargement de la page précédente.

Voici la configuration de mes sessions, donc je sais qu'il devrait stocker les données:

'driver' => 'native',
'lifetime' => 120,
'expire_on_close' => false,

Pourquoi Laravel ne stocke-t-il pas les données de session lors des chargements de page?

13
eComEvo

Le problème vient du fait que vous tuez le script avant que Laravel ne termine son cycle de vie d'application. Les valeurs mises en session (mais non encore stockées) ont également été supprimées.

Lorsqu'un cycle de vie d'application Laravel commence, les valeurs put dans Session ne sont pas encore stockées jusqu'à la fin du cycle de vie de l'application. C'est à ce moment que toute valeur put dans Session sera finalement/vraiment stored.

Si vous vérifiez la source vous retrouverez le même comportement mentionné ci-dessus:

 public function put($key, $value)
 {
     $all = $this->all();

     array_set($all, $key, $value);

     $this->replace($all);
 }

Si vous souhaitez le tester, procédez comme suit:

  1. Stocker une valeur en session sans tuer le script.

    Route::get('test', function() {
        Session::put('progress', '5%');
        // dd(Session::get('progress'));
    });
    
  2. Récupérer la valeur déjà stocké :

    Route::get('test', function() {
        // Session::put('progress', '5%');
        dd(Session::get('progress'));
    });
    
36
Rubens Mariuzzo

Rubens Mariuzzo réponse est très bon. Je veux juste ajouter que si vous souhaitez que les données soient stockées immédiatement, vous pouvez utiliser la méthode de sauvegarde:

Session::put('progress', '5%');
Session::save();
22
sergei

Pour moi, même après que les données aient été stockées dans la session correctement:

    dd(Session::all());

ne renvoie rien, mais:

    print_r(Session::all());

renvoie toutes les données de la session!

1
Alex

Dans mon cas, j'ai flashé la variable dans une requête, puis je l'ai mise en session dans une autre requête (portant le même nom).

Malheureusement, la méthode de terminaison a parcouru toutes les propriétés précédemment flashées et a nettoyé ma propriété de session nouvellement créée (elle a été vidé dans une requête précédente, aussi Laravel a-t-il pensé qu'il n'était plus nécessaire et ne pouvait pas dire qu'elle était nouvellement créée). Je l'ai compris la méthode de débogage Kernel->terminateMiddleware. Vous pouvez mettre un point d'arrêt dans la méthode de terminaison. À un moment donné, il atteint Store->ageFlashData. C'est la méthode responsable de la suppression de ma propriété.

0
Artur Owczarek