我正在尝试从Auth
类(app / Exceptions / Handler.php)的render方法中访问App\Exceptions\Handler
类,以确定用户当前是否已登录,使用Auth::check()
方法。
这在5.1中运行良好,但我升级到5.2,它不再有效。
为了调试这个,我一直在向日志打印Auth::user()
(返回NULL),然后将redirect()返回到另一个视图。
然后从视图/控制器重定向到,将相同的Auth::user()
打印到日志,按预期工作并返回登录用户。
所以从Exceptions\Handler
类中访问Auth类或user()方法似乎没有问题,只是由于某种原因它返回NULL,而应用程序的其他部分返回User ..
感谢您的任何信息!
答案 0 :(得分:6)
这是因为StartSession
中间件位于$middlewareGroups
(应用程序的路由中间件组)内,因此您无法访问经过身份验证的中间件user,因为初始化会话的中间件在生命周期的后期比ExceptionHandler
开始。
在app\Kernel.php
文件中,移动此行:
\Illuminate\Session\Middleware\StartSession::class,
从$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
答案 1 :(得分:3)
经过一番研究,似乎404错误是唯一的罪魁祸首。如果它是500错误,Auth :: user()工作。所以,在我的routes.php文件中,我在底部添加了这个
Route::any('{page}', 'ErrorController@Error404')->where('page', '(.*)');
捕获任何未处理的端点。在ErrorController @ Error404方法中,我可以访问Auth类。因此,无论您在App\Exceptions\Handler
中拥有什么逻辑,都可以在ErrorController@Error404
方法中复制它。 (或者更好:将其提取到可以在两个地方引用的其他实体。)