2
votes

Pourquoi ma session Laravel 5.7 ne fonctionne pas?

J'essaie de faire fonctionner les sessions dans Laravel 5.7, mais je n'arrive pas à le faire fonctionner; Je ne sais pas pourquoi. J'ai regardé la documentation officielle, regardé un tas de messages SO, fait une recherche sur Google pour le problème sur d'autres sites, et je ne peux toujours pas le comprendre.

En gros, j'ai un itinéraire comme celui-ci dans web.php:

php artisan config:clear
php artisan route:clear

Ensuite, dans la méthode index de SomeController , J'ai ce qui suit:

a:5:{s:6:"_token";s:40:"token-here";s:9:"_previous";a:1:{s:3:"url";s:26:"http://example.com/some_path";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}i:0;s:5:"test3";i:1;s:16:"Some Third Value";}

Avec cela, j'obtiens toujours la Valeur de sauvegarde renvoyée à l'écran.

Si Je vais dans / storage / framework / sessions , je vois un fichier de session qui a le contenu suivant (que j'ai anonymisé):

session(['test', 'Some Value']);
session(['test2', 'Some Other Value']);
session(['test3', 'Some Third Value']);
$value = session('test', 'Backup Value');
echo $value;

En gros , il semble que la session fonctionne en quelque sorte, mais elle ne semble stocker que test3 . Si je commente la ligne test3 dans le contrôleur, alors il ne stocke que test2 . Et même si je n'ai que la ligne test dans le contrôleur, il ne récupère toujours pas la valeur.

J'ai également essayé de basculer la session en session DB avec la session appropriée migrer le fichier à la https://laravel.com/docs/5.7/session , mais c'est ne fonctionne toujours pas.

En gros, je n'ai aucune idée de ce qui se passe. Je peux dire que je n'utilise pas l'authentification native de Laravel, donc je ne sais pas si cela compte, mais je pense que cela ne devrait pas. De plus, j'ai essayé de redémarrer mon hôte local, mais cela n'a pas fait de différence et d'exécuter les deux commandes suivantes, qui ne semblent rien changer:

Route::get('/some_path', 'SomeController@index');

Enfin, je J'ai essayé d'ajouter use Session en haut du contrôleur, mais cela ne semble pas non plus avoir d'importance.

En gros, je ne sais pas quoi faire. Qu'est-ce qui pourrait en être la cause? Merci.


5 commentaires

Vous pouvez utiliser la méthode push de session de Laravel. par exemple Session :: push ('test', 'some value');


Que se passe-t-il si vous mettez cela en premier? $ value = session ('test', 'Valeur de sauvegarde');


Deepak Singh, Session :: put () et Session :: push () fonctionnent, mais pas session () . Pourquoi? techcyclist, changer l'ordre ne faisait aucune différence. De plus, une partie de mon fichier de session ressemble maintenant à ce qui suit: "test"; i: 1; s: 10: "Some Value"; s: 4: "test"; s: 10: "Some Value"; s: 5: "test2"; s: 16: "Some Other Value"; Fondamentalement, il semble stocker des éléments à la fois de session () et Session :: put () , bien que celui de session () ne puisse pas être récupéré. Je suis toujours si confus. Que fait Laravel sous le capot pour empêcher session () de fonctionner?


De plus, pour ce que ça vaut, il semble que la classe Session ne permette que la méthode de sauvegarde des sessions par fichier. J'ai essayé de changer SESSION_DRIVER dans session.php de fichier à base de données , mais ce n'est pas enregistré dans la base de données; il est toujours sauvegardé dans le fichier dans le répertoire storage .


@HartleySan Mis à jour avec une réponse. Vérifiez si cela vous aide.


6 Réponses :


7
votes

Ce qui se passe ici, c'est que lorsque vous ajoutez ceci:

session(['test1' => 'xx']);

Cela ajoute test à l'index 0e de la session et x au 1er . Maintenant, quand vous refaites un

session(['test' => 'x']);

Il écrase le 0e et le 1er index de session par de nouvelles valeurs. Par conséquent, lorsque vous imprimez les données de session, vous obtenez les dernières valeurs. Vous pouvez vérifier cela en faisant un dd (session () -> all ()) et en voyant la même chose à l'écran. Si vous souhaitez créer une relation clé-valeur et stocker les données dans un tel emplacement, veuillez utiliser la syntaxe suivante:

session(['test1', 'xx'])
session(['test', 'x'])


4 commentaires

D'accord, je me sens officiellement stupide maintenant. J'utilisais la mauvaise syntaxe. Plus précisément, je faisais session (['test', 'Some Value']) , alors que j'aurais dû faire session (['test' => 'Some Value']) < / code>. Il fonctionne maintenant avec le fichier de session, ce qui est bien. Cependant, lorsque je change le pilote de session sur database , même avec la table DB là-bas, il enregistre toujours la session dans le fichier. Des idées?


Cela ne devrait pas se produire si vous avez correctement configuré le pilote de session en tant que db. Assurez-vous de vérifier que votre SESSION_DRIVER dans le fichier .env est défini comme base de données. Vérifiez également le fichier session.php. Enfin, veuillez exécuter les deux commandes php artisan config: clear et php artisan cache: clear et déconnectez-vous et reconnectez-vous et vérifiez les entrées dans la base de données.


Cripes! Je l'ai finalement réussi, Deepak. Je n'avais pas changé la valeur SESSION_DRIVER dans le fichier .env . (Je ne me souviens pas que cela ait été mentionné nulle part dans la documentation Laravel.) Quoi qu'il en soit, ce changement a instantanément fait tout fonctionner. Merci beaucoup!


Salut mon pote! :)



2
votes

Laravel 5.7 - stocker la valeur dans la session avec le système de fichiers:

Définir la valeur dans la session:

session()->forget('email');

Obtenir la valeur de la session :

$email = session()->get('email');

Supprimer la session de courrier électronique:

session()->put('email', 'jai@gmail.com');

Cela fonctionne comme un charme :)

p >


1 commentaires

@davefrassoni assurez-vous d'avoir inclus 'use Illuminate \ Support \ Facades \ Session;' en haut de votre manette.



0
votes

Dans ce cas, tout ce que vous avez à faire est d'ajouter une fonction de chaîne middleware "web" à votre règle de routage. par exemple

php artisan config:clear
php artisan route:clear

Puis vider le cache:

Route::get('/some_path', 'SomeController@index')->middleware('web');


0 commentaires

2
votes

ceux qui ne parviennent pas à enregistrer la session, le problème est que vous avez oublié de mettre la fonction save () après put donné est l'exemple.

$cartCount = Session::get('cartCount');
        if(empty($cartCount)){
            $cartCount = 0;
            Session::put('cartCount', $cartCount);
        }
        Session::save();


0 commentaires

1
votes

Session :: save () peut vous sauver la vie, essayez-le si le problème persiste.


0 commentaires

1
votes

Si pour une raison quelconque votre code ne fonctionne pas - par exemple, vous utilisez dd () quelque part, alors votre session ne sera jamais sauvegardée. Cela m'a fait trébucher pendant 20 bonnes minutes.


0 commentaires