Laravel中Api路由組使用session解決辦法
首先, 不建議在laravel的api路由組中使用session維持會話,這不是一個好的做法 。不過我們可能在某些客觀條件下,需要使用,今天記錄下自己遇到的坑。
中間件
api路由組需要同時添加兩個中間件,缺一不可
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
StartSession
中間件中主要是設置session文件內容、設置響應頭中的set-cookie字段,且框架對cookie內容進行了加密,所以如果不添加EncryptCookies
中間件的話,會被匹配不到實際的session id,成爲無效的會話。
中間件位置
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
'throttle:60,1',
'bindings',
\Barryvdh\Cors\HandleCors::class,
],
我發現將EncryptCookies
、StartSession
兩個中間件放到api數組末尾,會不生效,可能是上邊的中間件有些影響,具體沒再深究【2020.2.25日補充:放到Cors中間件後邊會不生效,建議往前方或者放在非官方的中間件的前邊,以避免影響】,因爲也很少這樣用,不過這個問題浪費了我大量時間,特此提醒大家以下。
寫入session
其實在配置好兩個中間件後,laravel封裝的session功能就可以使用了
session()->put('test', 123);
//這裏不需要執行 session()->start() 和 session()->save();
//而且,如果添加那兩個中間件的話,執行了start和save也不起作用
包括auth相關的都可以使用,比如登陸
$user = User::first();
auth()->login($user);
//下一次請求時
var_dump(auth()->user());
//可以獲取 user 信息