laravel 5.1:Auth::check 在 ServiceProvider 中返回 false

ale*_*lex 1 php authentication laravel laravel-5 laravel-5.1

我已经在寻找类似的问题,但没有帮助我。 Auth::check始终返回 false ,Auth::guest始终返回 true,身份验证中间件工作正常(如果用户已登录,则请求继续,如果用户未登录,则将用户重定向到登录页面)。怎么了?

编辑:我知道它发生在提供者引导方法中,所以问题是:如何在提供者引导方法中检查用户登录状态?这是我的提供程序启动方法,它在所有视图中共享一个菜单:

 public function boot(MenuController $menu_controller)
{
   //dd(\Auth::check()) DOES NOT WORK HERE

    $nav_menu = $menu_controller::roots()->get();

    view()->share('nav_menu',$menus);
}
Run Code Online (Sandbox Code Playgroud)

Mop*_*ppo 8

Auth::check()正在使用会话来检查 aUser是否经过身份验证。

在 Laravel 中,会话通过中间件初始化所有中间件在服务提供者启动阶段之后执行

因此,在您的服务提供商中,您无法访问会话:它还没有被初始化

解决方案是检查身份验证并在中间件中完成您的工作,然后让该中间件在此之后执行:

\Illuminate\Session\Middleware\StartSession::class
Run Code Online (Sandbox Code Playgroud)

那是启动会话的中间件。

另一种解决方案是在服务提供者中使用带有视图编辑器的回调:

public function boot()
{
    //compose all the views....
    view()->composer('*', function ($view) 
    {
        //works here
        $check = \Auth::check(); 

       //other code... 
    });  
}
Run Code Online (Sandbox Code Playgroud)

只有在实际组合视图时才会执行回调,因此中间件将已经执行并且会话将可用