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

Laravel - How to get current user in AppServiceProvider

所以我通常使用 Auth::user() 获取当前用户,当我确定用户是否实际登录时 Auth::check。然而,这在我的 AppServiceProvider 中似乎不起作用。我正在使用它在所有视图之间共享数据。我在登录时 var_dump Auth::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'));
    }

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

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

但是,如果由于某些其他原因您想在服务提供商中执行此操作,您可以使用带有回调的 view composer 来执行此操作,如下所示:

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 );    
    });  
}

只有当视图真正被组合时才会执行回调,因此中间件已经执行并且会话可用

AuthServiceProviderboot()函数中写下这几行代码

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

此处 * 表示 - 在您的所有视图中 $currentUser 变量可用。

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

根据我的 Laravel 7 经验,Auth::user()AppServiceProvider.php 中不起作用,而是辅助函数 auth()->user() 帮了我的忙。

public function boot()
    {

        if (auth()->check()) {
            View::composer('layout.app', function ($view) {
                $userName = auth()->user()->name;
                $view->with(['userName' => $userName]);
            });
        }
    }