在Exceptions\Handler.php中访问Auth

Gra*_*m T 5 php laravel laravel-5

我正在尝试Auth从类的render方法App\Exceptions\Handler(app/Exceptions/Handler.php)中访问该类,以确定用户当前是否已使用该Auth::check()方法登录.

这在5.1中运行良好,但我升级到5.2,它不再有效.

为了调试这个,我一直在打印Auth::user()日志(返回NULL),然后将redirect()返回到另一个视图.

然后从视图/控制器重定向到,将其打印Auth::user()到日志,按预期工作并返回登录用户.

所以从类中访问Auth类或user()方法似乎没有问题Exceptions\Handler,只是由于某种原因它返回NULL,而应用程序的其他部分返回User ..

感谢您的任何信息!

tom*_*rod 7

发生这种情况是因为StartSession中间件位于内部$middlewareGroups(应用程序的路由中间件组),因此您无法访问经过身份验证的用户,因为初始化会话的中间件在生命周期的后期启动时比启动会话更晚ExceptionHandler.

app\Kernel.php文件中,移动此行:

 \Illuminate\Session\Middleware\StartSession::class,
Run Code Online (Sandbox Code Playgroud)

$middlewareGroups全局堆栈$middleware.这些中间件在您的应用程序的每个请求期间运行,因此,在此之后,Auth::user()将工作.


警告:使用此解决方案,您将无法使用cookie会话驱动程序.适用于file其他人.


更新:

如果您仍然需要使用StartSession内部全局堆栈$middleware并且还需要cookie session driver,则必须在下一个顺序中将三个中间件移动$middlewareGroup$middleware:

\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class
Run Code Online (Sandbox Code Playgroud)


mur*_*ibu 3

经过一些研究,404 错误似乎是唯一的罪魁祸首。如果是 500 错误,则 Auth::user() 有效。所以,在我的routes.php文件中,我在底部添加了这个

Route::any('{page}', 'ErrorController@Error404')->where('page', '(.*)');
Run Code Online (Sandbox Code Playgroud)

捕获任何未处理的端点。在该 ErrorController@Error404 方法中,我可以访问 Auth 类。因此,无论您的 中有什么逻辑App\Exceptions\Handler,您都可以在方法中复制它ErrorController@Error404。(或者更好:将其提取到可以在两个地方引用的其他实体。)