1. 程式人生 > >6種解決laravel報錯 Session store not set on request

6種解決laravel報錯 Session store not set on request

回答1:

如果您需要會話狀態,CSRF保護等,則需要使用Web中介軟體

Route::group(['middleware' => ['web']], function () {
    // your routes here
});

 

回答2:

如果新增你的routes內部web middleware因任何原因不起作用,那麼嘗試將其新增$middlewareKernel.php

protected $middleware = [
        //...
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];


 

回答三:

如果Cas Bloem的答案不適用(即您確實web在適用的路由上獲得了中介軟體),您可能需要檢查HTTP核心中的中介軟體的順序。

預設順序Kernel.php是:

$middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],
];

請注意,VerifyCsrfToken之後StartSession。如果你有不同的順序,它們之間的依賴關係也會導致Session store not set on request.異常。


 

回答4:

在我的情況下(使用Laravel 5.3),僅新增以下2箇中間件允許我訪問API路由中的會話資料:

  • \App\Http\Middleware\EncryptCookies::class
  • \Illuminate\Session\Middleware\StartSession::class

整個宣告($middlewareGroups在Kernel.php中):

'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:60,1',
            'bindings',
        ],


 

回答五:

Laravel [5.4]

我的解決方案是使用全域性會話助手: session()

它的功能比$ request-> session()稍微困難一些。

寫作

session(['key'=>'value']);

推動

session()->push('key', $notification);

檢索

session('key');


 

回答6:

問題可能是您嘗試訪問控制器__constructor()功能內的會話 。

從Laravel 5.3+開始,這是不可能的,因為它無論如何都無法工作,如升級指南中所述

在以前版本的Laravel中,您可以在控制器的建構函式中訪問會話變數或經過身份驗證的使用者。這從未打算成為框架的明確特徵。在Laravel 5.3中,您無法訪問控制器建構函式中的會話或經過身份驗證的使用者,因為中介軟體尚未執行。

 

解決方法

如果您仍想使用它,您可以動態建立中介軟體並在建構函式中執行它,如升級指南中所述:

作為替代方案,您可以直接在控制器的建構函式中定義基於Closure的中介軟體。在使用此功能之前,請確保您的應用程式正在執行Laravel 5.3.4或更高版本:

middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }
}