2016-01-23 7 views
7

Ich habe eine brandneue Installation von Laravel 5, in der Tat habe ich dies auf mehrere Versionen versucht und immer wieder das gleiche Problem.Meine Laravel 5.2.10 Sitzungen werden nicht bestehen

Ich habe nichts von der Standardeinstellung geändert, außer den Sitzungstreiber auf redis zu setzen. (Datei basiert hat auch das gleiche Problem).

Ich habe zwei gesetzt Routen als

Route::get('/set/{value}', function($value) { 
    var_dump(Session::getId()); 
    Session::set('test', $value); 
    return view('welcome'); 
}); 

Route::get('/get', function() { 
    return 'Get ' . Session::get('test'); 
}); 

folgt Wenn ich die URL/set/abc besuche ich die Sitzung in REDIS erscheinen sehen (ich sehe auch die erstellte Datei, wenn die Datei auf Basis verwendet wird). Die Sitzung sieht in REDIS wie folgt gut aus

127.0.0.1:6379> KEYS * 
1) "laravel:1a3ae6caff6346e4a173fdc1ab4c6eb0f138806b" 
2) "laravel:fed1af2fb44c6e625953237c3fa6fcbb05366a5c" 
3) "laravel:cb37286ccfe3e7caa20557aca840f50cb5a5f20d" 

Jedes Mal, wenn ich die Seite besuche, erstellt es eine neue Sitzung neu.

Die wichtigsten Teile session.php Datei ist wie folgt:

'lifetime' => 120, 

'expire_on_close' => false, 

ich auch in REDIS die TTL der Session-Variablen überprüft haben und sie bei 120 Minuten (äquivalent in Sekunden) erhalten initialisiert.

Irgendeine Idee, was ich falsch mache?

Es könnte erwähnenswert sein, ich verwende eine Homestead vm (komplett Lager), um dies zu testen. Ich habe auch versucht, mehrere Browser zu verwenden. Es werden niemals Cookies an den Browser gesendet. Ich nehme an, dass eine Sitzungs-ID als Teil der ersten Anfrage an den Browser gesendet werden sollte.

+0

, die wirklich seltsam ... Ich versuche, das Verhalten lokal zu replizieren.Ich frage mich, ob die "getId" -Methode etwas böses tut – FBidu

+0

@FBidu Ich habe versucht mit und ohne die getId-Funktion, es scheint es nicht in irgendeiner Weise zu beeinflussen, ich bekomme das gleiche seltsame Verhalten. –

+0

@FBidu Eigentlich ['getId'] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Session/Store.php#L162-L165) tut, was es impliziert, es tut und nichts mehr:). – Bogdan

Antwort

6

Laravels Middleware-Klasse \Illuminate\Session\Middleware\StartSession ist verantwortlich für den Start Ihrer Sitzung. Vor L5.2 wurde dies bei jeder Anforderung ausgeführt, da es Teil des globalen Middlewarestacks war. Jetzt ist es optional, da L5.2 sowohl eine Web-Benutzeroberfläche als auch eine API innerhalb derselben Anwendung zulassen möchte.

Wenn Sie app/Http/Kernel.php öffnen, sehen Sie, dass die StartSession Middleware Teil einer Middleware-Gruppe namens web ist. Sie müssen alle Ihre Routen dorthin setzen, damit Ihr Beispiel funktioniert.

Route::group(['middleware' => ['web']], function() { 
    Route::get('/set/{value}', function($value) { 
     var_dump(Session::getId()); 
     Session::set('test', $value); 
     return view('welcome'); 
    }); 

    Route::get('/get', function() { 
     return 'Get ' . Session::get('test'); 
    }); 
}); 

Sie können sehen, dass die web Middleware-Gruppe für andere Dinge auch verantwortlich ist für alle Ansichten, die die $errors Variable wie bereitstellt.

Sie können weitere Informationen in der Dokumentation lesen:

standardmäßig die routes.php-Datei enthält eine einzelne Route sowie eine Route Gruppe, die die web Middleware-Gruppe auf allen Strecken gilt es enthält. Diese Middleware-Gruppe bietet Sitzungsstatus- und CSRF-Schutz für Routen.

Alle Strecken, die nicht innerhalb der Gruppe web Middleware platziert haben keinen Zugriff auf Sitzungen und CSRF-Schutz haben, so stellen Sie sicher, dass alle Routen, die diese Funktionen benötigen in der Gruppe angeordnet sind. Typischerweise werden Sie die meisten Ihrer Routen innerhalb dieser Gruppe platzieren:

Quelle: https://laravel.com/docs/5.2/routing

+0

Brilliant, danke Thomas, ich habe glücklicherweise die gleiche Antwort von einem Mann auf Github bekommen, kurz bevor du gepostet hast :), ihr seid beide Lebensretter. –

+0

Oh okay. :) Ich bin froh, dass du es aussortiert hast. –

+0

Ich habe das gleiche Problem. Obwohl meine Route in einer Gruppe innerhalb der Gruppe ist, die ein Middleware 'web' hat. Sollte meine Route also nicht unter der Web-Middleware liegen? – majidarif

Verwandte Themen