我正在尝试从App'Exceptions'Handler
类(app/Exceptions/Handler.php)的渲染方法中访问Auth
类,以确定用户当前是否使用Auth::check()
方法登录。
这在 5.1 中工作正常,但我已经升级到 5.2 并且不再有效。
为了调试它,我一直在将Auth::user()
打印到日志中(返回 NULL),然后将重定向()返回到另一个视图。
然后从重定向转到的视图/控制器,将相同的Auth::user()
打印到日志中,该日志按预期工作并返回登录用户。
因此,从Exceptions'Handler
类中访问Auth类或user()方法似乎没有问题,只是由于某种原因它返回NULL,而应用程序的其他部分返回User。
感谢您提供有关此的任何信息!
发生这种情况是因为中间件StartSession
$middlewareGroups
(应用程序的路由中间件组)内部,因此您无权访问经过身份验证的用户,因为初始化会话的中间件在生命周期中比ExceptionHandler
晚开始。
在app'Kernel.php
文件中,移动以下行:
'Illuminate'Session'Middleware'StartSession::class,
从$middlewareGroups
到全局堆栈$middleware
。这些中间件在每次向应用程序发出请求期间运行,因此在此之后,Auth::user()
将起作用。
警告:使用此解决方案,您将无法使用
cookie
会话驱动程序。与file
和其他人配合良好。
更新:
如果你仍然需要在全局堆栈$middleware
中使用StartSession
并且还需要cookie session driver
,则必须按下一个顺序将三个中间件从$middlewareGroup
移动到$middleware
:
'App'Http'Middleware'EncryptCookies::class,
'Illuminate'Cookie'Middleware'AddQueuedCookiesToResponse::class,
'Illuminate'Session'Middleware'StartSession::class
经过一些研究,404错误似乎是唯一的罪魁祸首。如果是 500 错误,Auth::user() 可以工作。所以,在我的路由.php文件中,我在底部添加了这个
Route::any('{page}', 'ErrorController@Error404')->where('page', '(.*)');
以捕获任何未处理的终结点。在该ErrorController@Error404方法中,我可以访问Auth类。因此,无论您App'Exceptions'Handler
中有什么逻辑,您都可以在ErrorController@Error404
方法中复制它。(或者更好的是:将其提取到可以在两个位置引用的其他实体。