laravel獲取不到session的三種解決辦法
阿新 • • 發佈:2018-12-05
問題:引用第三方類庫時,使用全域性函式session()可以儲存session,但是獲取不到
1、路由置於 web 中介軟體下,修改app/Http/Kernel.php檔案,如下
protected $middlewareGroups = [ //中介軟體web 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, //看到這裡了嗎!StartSession!!!!要把路由放在這個中介軟體了才會啟動Session!! \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', ], ];
2、修改路由寫法,如下
//兩種路由中介軟體寫法各人喜好!
Route::get('/', function () {
//路由放在這裡
})->middleware('web');
Route::group(['middleware' => ['web']], function () {
//路由放在這裡
});
//routes.php
3、Laravel不用php原生的session,那麼在controller之後應該做了一些事情,將session寫入到檔案中,而不是每次put
操作都寫操作,這樣會IO操作太頻繁的,影響效能的。
檢視呼叫相關的程式碼。laravel編譯後,在bootstrap/compiled.php
class Middleware implements HttpKernelInterface { ... public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) { $this->checkRequestForArraySessions($request); if ($this->sessionConfigured()) { $session = $this->startSession($request); // 啟動session $request->setSession($session); } $response = $this->app->handle($request, $type, $catch); // 呼叫controller的method if ($this->sessionConfigured()) { $this->closeSession($session); //關閉session $this->addCookieToResponse($response, $session); } return $response; } ... protected function closeSession(SessionInterface $session) { $session->save(); // 儲存session $this->collectGarbage($session); } }
可以看見,在呼叫完controller之後,呼叫了session->save()
的方法,來主動的儲存session。這樣session才能落地儲存起來,如果在controller或者view裡面寫了exit;
,那麼session是不會被儲存的,除非主動的寫Session::save()
才能手工的儲存起來。或者把die();exit();換成return!