2017-06-02 51 views
2

我正在玩Laravel 5.4.23,当我遇到404页面auth(),auth()->check(),auth()->user(),并且这些未初始化,因此在视图中返回null,附近的任何地方。auth()方法null异常

我还跟AppServiceProvider.php类做一些测试,

dd(auth()->check()); 

回报在boot法空,即使我登录,这使得0了意义。

这意味着,无论何时用户点击404页面,navbars等都不会呈现用户数据,例如,传统上我们在navbar的顶部右侧有用户配置文件按钮,就像这里在stackoverflow上那样在Laravel,这是不可能的,我所看到的。

我在正确的轨道上还是错过了什么?

在我看来,Laravel尝试在完成我测试的请求后登录用户。

希望我在这里找到答案。

谢谢。

UPDATE:

包括在app \提供商的boot方法手动登录尝试\ AppServiceProvider似乎解决空问题的AUT()命令,但我相信,这将尝试登录的用户每页请求两次,因为显然Laravel在启动后获取登录用户,异常请求和不知道其他内容。

回答

2

发生这种情况是因为会话由web中间件组初始化。当找不到路由时,中间件不会被初始化。因此,应用程序无法从会话中找到经过身份验证的用户。

虽然有一个解决方法。将会话和cookie中间件从web中间件组移动到全局中间件似乎解决了这个问题。但缺点是应用程序中的每条路线都默认启用会话和Cookie。如果你有API路线,这可能会有问题。

MOVE(不要复制),这些航线从web中间件组($middlewareGroups)全球中间件列表($middleware)。

\App\Http\Middleware\EncryptCookies::class, 
\Illuminate\Session\Middleware\StartSession::class, 

可以跳过EncryptCookies中间件,如果你不想使用自己的remember_token在你的错误页面,以检测用户。

+0

这仍然不能解决在AppServiceProvider,Auth :: check()仍然返回false的问题,它在处理程序,但不是在appserviceprovider中工作,我试图查看laravel源代码,看看是否有一个可能的方式在其余的之前加载Auth – Emad

+0

为什么你想要在服务提供商的auth用户? – Sandeesh

+0

我并不真的需要它,我只是想和laravel源代码哈哈一塌糊涂,所以我试图找出如何工作的事情,到目前为止,您的解决方案工作,我仍然在他们的源代码检查,每周1次这里laravel用户:)昨天 – Emad