在Exceptions \ Handler.php中访问Auth

时间:2016-01-24 22:43:36

标签: php laravel laravel-5

我正在尝试从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 ..

感谢您的任何信息!

2 个答案:

答案 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方法中复制它。 (或者更好:将其提取到可以在两个地方引用的其他实体。)