Laravel - 如何在AppServiceProvider中获取当前用户

Cod*_*rts 15 php authentication service-provider laravel laravel-5

所以我通常会使用当前用户Auth::user(),当我确定用户是否实际登录时Auth::check.然而,这似乎不适用于我的AppServiceProvider.我用它来跨所有视图共享数据.我var_dumpAuth::user()Auth::check()登录时,我得到NULLfalse.

如何让当前用户进入我的AppServiceProvider?如果这是不可能的,那么user_id在所有视图中获取每个用户唯一的数据(根据不同的数据)的方法是什么.这是我的澄清代码.

if (Auth::check()) {
        $cart = Cart::where('user_id', Auth::user()->id);
        if ($cart) {
            view()->share('cart', $cart);

        }
    } else {
        view()->share('cartItems', Session::get('items'));
    }
Run Code Online (Sandbox Code Playgroud)

Mop*_*ppo 25

Laravel会话在中间件中初始化,因此您无法从服务提供者访问会话,因为它们在请求生命周期中的中间件之前执行

您应该使用中间件来从会话中共享您的变量

如果由于某些其他原因您希望在服务提供商中执行此操作,则可以使用带有回调的视图编辑器,如下所示:

public function boot()
{
    //compose all the views....
    view()->composer('*', function ($view) 
    {
        $cart = Cart::where('user_id', Auth::user()->id);

        //...with this variable
        $view->with('cart', $cart );    
    });  
}
Run Code Online (Sandbox Code Playgroud)

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


Man*_*ash 17

InAuthServiceProviderboot()函数写这几行代码

public function boot()
{
    view()->composer('*', function($view)
    {
        if (Auth::check()) {
            $view->with('currentUser', Auth::user());
        }else {
            $view->with('currentUser', null);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

*意味着 - 在您的所有视图中$currentUser变量都可用。

然后,{{ currentUser }}如果用户已通过身份验证,则从视图文件将为您提供用户信息,否则为空。