2016-01-23 11 views
7

私はLaravel 5の新しいインストールをしています。実際、これを複数のバージョンで試してみましたが、同じ問題を抱え続けています。私のLaravel 5.2.10セッションは残っていません

セッションドライバを設定する以外は、デフォルトから何も変更していません。 (ファイルベースも同じ問題があります)。私はセッションはRedisの中に表示されたURL /設定/ ABCを訪問すれば

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'); 
}); 

を次のように

は、私が設定した2つのルートを持っている(私はまた、ベースのファイルを使用するときに作成したファイルを参照してください)。セッションは以下のようにREDISで正常に見えます

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

私がページにアクセスするたびに、新しいセッションが再作成されます。私はまた、Redisの中でセッション変数のTTLをチェックして、彼らは120分(秒相当)で初期化されますか

'lifetime' => 120, 

'expire_on_close' => false, 

次のように

session.phpファイルのキーパーツです。

私が間違っていることは何ですか?

私はこれをテストするためにホームステッドVM(完全在庫)を使用しています。私はまた、複数のブラウザを使用してみました。ブラウザにクッキーが送られることはありません。私は最初のget要求の一環としてセッションIDをブラウザに送信する必要がありますか?

+0

本当に奇妙だ...私は、ローカルに行動を再現しようとしています。私は 'getId'メソッドが何か厄介なことをしているのだろうかと思う。 – FBidu

+0

@FBidu私はgetId関数を使って試してみたが、何らかの方法で影響を与えていないようだ。 –

+0

@FBidu実際に['getId'](https://github.com/laravel/framework/blob/5.2/src/Illuminate/Session/Store.php#L162-L165)はそれが何を意味するのか、 )。 – Bogdan

答えて

6

Laravelのミドルウェアクラス\Illuminate\Session\Middleware\StartSessionは、セッションの開始を担当します。 L5.2より前は、グローバルミドルウェアスタックの一部であるため、これはすべてのリクエストで実行されました。今、L5.2が同じアプリケーション内でWeb UIとAPIの両方を許可したいので、オプションです。

app/Http/Kernel.phpを開くと、StartSessionミドルウェアがwebというミドルウェアグループの一部であることがわかります。あなたはあなたの例がうまくいくためにそこにすべてのルートを入れる必要があります。

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'); 
    }); 
}); 

あなたはwebミドルウェアグループはまた、すべてのビューに$errors変数を提供するような他のもののために責任があることがわかります。

あなたは、ドキュメントでそれについての詳細を読むことができます:デフォルトでは

は、routes.phpファイルには、1つのルートだけでなく、それに含まれるすべてのルートにwebミドルウェア・グループを適用するルートグループが含まれています。このミドルウェアグループは、ルートへのセッション状態とCSRF保護を提供します。

webミドルウェアグループ内に配置されていないルートは、セッションやCSRF保護にアクセスできないため、これらの機能が必要なルートがグループ内にあることを確認してください。通常、このグループ内のあなたのルートの大部分が配置されます:

出典:https://laravel.com/docs/5.2/routing

+0

すばらしい、ありがとうThomas、私は幸運にもあなたが投稿した直前にgithubの男から同じ答えを得ました:)あなたは両方です人生の節約。 –

+0

大丈夫。 :)私はあなたがそれを整理してうれしいです。 –

+0

私は同じ問題を抱えています。私のルートは、ミドルウェア「ウェブ」を持つグループ内のグループにありますが。だから私のルートは、Webミドルウェアの下にあるべきではないですか? – majidarif

関連する問題