我最近创建了一个新的Laravel项目,并遵循身份验证指南.当我访问我的登录或注册路由时,我收到以下错误:
ErrorException in Request.php line 775: Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
我没有编辑任何核心Laravel文件,我只创建了视图并将路由添加到我的routes.php文件中
// Authentication routes Route::get('auth/login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'login']); Route::post('auth/login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'login']); Route::get('auth/logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'logout']); // Registration routes Route::get('auth/register', ['uses' => 'Auth\AuthController@getRegister', 'as' => 'register']); Route::post('auth/register', ['uses' => 'Auth\AuthController@postRegister', 'as' => 'login']);
我对Laravel没有多少经验,所以请原谅我的无知.我知道有另一个问题要问同样的事情,但这些答案似乎都不适合我.谢谢阅读!
编辑:
这是我的register.blade.php按要求.
@extends('partials.main') @section('title', 'Test | Register') @section('content')@endsection
Cas Bloem.. 140
如果您需要会话状态,CSRF保护等,则需要使用Web中间件.
Route::group(['middleware' => ['web']], function () { // your routes here });
我确实有这个,我只是包括相关的路线. (2认同)
Waiyl Karim.. 51
如果添加你的routes
内部web middleware
因任何原因不起作用,那么尝试将其添加$middleware
到Kernel.php
protected $middleware = [ //... \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, ];
该死的,这对我有用,但我不高兴这是一个"修复",而不是解决方案.不管怎么说,还是要谢谢你! (4认同)
George Kagan.. 39
在我的情况下(使用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', ],
Hugh Grigg 葛.. 19
如果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.
异常.
如果您需要会话状态,CSRF保护等,则需要使用Web中间件.
Route::group(['middleware' => ['web']], function () { // your routes here });
如果添加你的routes
内部web middleware
因任何原因不起作用,那么尝试将其添加$middleware
到Kernel.php
protected $middleware = [ //... \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, ];
在我的情况下(使用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', ],
如果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.
异常.
问题可能是您尝试访问控制器__constructor()
功能内的会话 .
从Laravel 5.3+开始,这是不可能的,因为它无论如何都无法工作,如升级指南中所述.
在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户.这从未打算成为框架的明确特征.在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行.
有关更多背景信息,请阅读Taylor的回复.
解决方法
如果您仍想使用它,您可以动态创建中间件并在构造函数中运行它,如升级指南中所述:
作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件.在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:
middleware(function ($request, $next) { $this->projects = Auth::user()->projects; return $next($request); }); } }
Laravel [5.4]
我的解决方案是使用全局会话助手: session()
它的功能比$ request-> session()稍微困难一些.
写作:
session(['key'=>'value']);
推动:
session()->push('key', $notification);
检索:
session('key');