1. 程式人生 > >laravel獲取不到session的三種解決辦法

laravel獲取不到session的三種解決辦法

問題:引用第三方類庫時,使用全域性函式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!