laravel 5.1:身份验证::检查返回 false 在服务提供商中


laravel 5.1: Auth::check return false in ServiceProvider

我已经在寻找类似的问题,但没有帮助我。 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);
}

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

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

因此,在您的服务提供商中,您无法访问会话:它尚未初始化

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

'Illuminate'Session'Middleware'StartSession::class

这是启动会话的中间软件。

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

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

回调仅在实际编写视图时执行,因此中间件已经执行并且会话可用

我有同样的问题,我解决了它

这是我如何解决的在我的服务提供商中 `

public function boot()
    { 
         view()->composer('partial.navbar', function($view) {
                $view->with('variabelToNavbar', $this->getVariable());
         });
    }

private function getVariable()
{
   if('Auth::check()) {
          //some code u want
   }
}
'

所以诀窍是使用 servide 提供程序中的函数检查身份验证。它不整洁,但它对我有用