2017-01-24 3 views
1

J'essaie actuellement de mettre en œuvre un moyen de flasher les données de session de la même manière que Laravel traite les données flash. Je suis conscient que Laravel remplacer les méthodes de session natives qui sont appelées par des fonctions comme session_start.Comment Laravel désactive-t-il les données de session flash?

Ils semblent le faire avec le paquet Http foundation de Symfony en créant des méthodes personnalisées pour open, read, write, etc. pour la session. Cela se fait à l'aide session_set_save_handler:

http://php.net/manual/en/function.session-set-save-handler.php

En utilisant cette fonction, vous pouvez mettre en œuvre votre logique ouverte lorsque vous démarrez une session ou une session sera écrite à. Mais jusqu'à présent, je ne peux pas trouver la logique directe dans la base de code Laravel où les données flash sont en train d'être désactivées.

Il serait logique de mettre à l'état initial les données flash juste avant la fonctionnalité write de la session. De cette façon, vous le supprimerez pour les demandes futures et vous serez sûr que cela n'arrivera qu'à la fin de votre code.

Quelqu'un pourrait-il me dire comment Laravel traite les messages flash de session?

Répondre

2

Dans la classe Illuminate\Session\Store, vous pouvez trouver la méthode save qui est appelée lorsque les sessions sont stockées. Aka le session_set_save_handler en essence.

https://github.com/laravel/framework/blob/7acc98e112cce4e04f30c7ee4fc0a53dbc5c425b/src/Illuminate/Session/Store.php#L261

Sur cette ligne la méthode $this->ageFlashData(); est appelée.

La méthode contient le code suivant

$this->forget($this->get('_flash.old', [])); 
    $this->put('_flash.old', $this->get('_flash.new', [])); 
    $this->put('_flash.new', []); 

donc un appel page toutes les données flash sont stockées dans _flash.new. Lorsque les sessions sont enregistrées, toutes les données de _flash.old sont effacées et tout ce qui est stocké dans _flash.new est déplacé vers _flash.old. Le _flash.new est prêt à stocker de nouvelles données pour le prochain appel page

Si vous voulez conserver les messages flash, par exemple sur un ajax appel, vous pouvez utiliser la méthode reflash() dans le magasin de la session qui se déplace tout le _flash.old retour à la _flash.new

+1

Qu'en est-il lorsque des requêtes ajax ou des redirections sont en cours? Est-ce que Laravel va également déplacer les données flash dans l'ancien ou y at-il des contrôles en place pour cela? Je suppose que vous pourriez obtenir un comportement indésirable si quelque chose comme une requête ajax ou des redirections provoque la mise à l'arrêt des données flash. –

+1

Lors d'un appel ajax, les données flash sont déplacées vers _flash.old. vous pouvez le voir dans le middleware StartSession. Si vous voulez conserver les données flash actives pour la prochaine requête, vous pouvez utiliser la méthode 'reflash' –