2016-01-23 85 views
7

我有一個全新安裝的Laravel 5,事實上,我已經嘗試了多個版本並繼續觸及相同的問題。我的Laravel 5.2.10會話不會持久

除了將會話驅動程序設置爲redis之外,我沒有更改默認設置。 (基於文件也有相同的問題)。

我有兩條路線設置如果我訪問的URL /設置/ ABC我看到會話出現在Redis的如下

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

(我也看到了使用基於文件時創建的文件)。在REDIS中會話看起來很好,如下所示

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

每次我訪問該頁面時,它都會重新創建一個新會話。

session.php文件文件的關鍵部分如下:

'lifetime' => 120, 

'expire_on_close' => false, 

我也曾在Redis的檢查會話變量的TTL以及他們在120分鐘(相當於秒)獲得初始化。

任何想法我做錯了什麼?

這可能值得注意我正在使用宅基地vm(完全股票)來測試這個。我也嘗試使用多個瀏覽器。沒有cookies被髮送到瀏覽器,我認爲會將session ID作爲初始獲取請求的一部分發送給瀏覽器?

+0

這真的很奇怪......我想在本地複製行爲。我想知道'getId'方法是否會產生令人討厭的效果 – FBidu

+0

@FBidu我嘗試過並沒有getId函數,它似乎沒有以任何方式影響它,我得到了相同的奇怪行爲。 –

+0

@Fidu實際上['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文件包含一個單一的路線,以及該web中間件組適用於它包含了所有路由的路由組。該中間件組爲路由提供會話狀態和CSRF保護。

未放置在web中間件組中的任何路由將無法訪問會話和CSRF保護,因此請確保任何需要這些功能的路由都放在組中。通常情況下,你將會把大部分的路線該組中:

來源:https://laravel.com/docs/5.2/routing

+0

輝煌,謝謝托馬斯,我很幸運地從github上的傢伙得到了同樣的答案,在你發佈之前不久),你們都是生活儲戶。 –

+0

哦,好的。 :)我很高興你把它整理出來。 –

+0

我遇到同樣的問題。儘管我的路線位於具有中間件「web」的組內。那麼我的路線不應該在網絡中間件之下嗎? – majidarif