回答1:
如果您需要会话状态,CSRF保护等,则需要使用Web中间件。
Route::group(['middleware' => ['web']], function () {
// your routes here
});
回答2:
如果添加你的routes
内部web middleware
因任何原因不起作用,那么尝试将其添加$middleware
到Kernel.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); }); } }