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