【问题标题】:Laravel - How to get current user in AppServiceProviderLaravel - 如何在 AppServiceProvider 中获取当前用户
【发布时间】:2016-09-19 05:37:09
【问题描述】:

所以我通常使用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'));
    }

【问题讨论】:

标签: php laravel authentication laravel-5 service-provider


【解决方案1】:

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

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

【讨论】:

  • 请注意,我今天尝试这样做(Laravel 5.4),它不适用于此答案中所示的闭包。为外部对象提供类名,例如view()->composer('*', \App\Http\ViewComposers\MyComposer::class) 是我让它识别 Auth::user() 的唯一方法,而不是 null
  • 如何在使用 API 时实现相同的功能,因为它们不是使用 Laravel API 时使用的刀片/视图
  • 是的,这种方法对我有用
【解决方案2】:

根据我的 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]);
            });
        }
    }

【讨论】:

  • 它在 laravel 8 中不起作用
【解决方案3】:

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

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

这里* 的意思是 - 在你的所有视图中$currentUser 变量是可用的。

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

【讨论】:

  • 我想将我的购物车数据分享到所有页面,这对我有很大帮助
  • 不错的解决方案,虽然我建议不要输入AuthServiceProvider,因为boot() 应该仅限于注册身份验证和授权服务。也许AppServiceProvider 甚至ComposerServiceProvider
  • 如何在使用 API 时实现相同的功能,因为它们不是使用 Laravel API 时使用的刀片/视图
  • @AbhiBurk 在 api 中,你必须传递一个令牌来获取数据。我不确定这是否可以在 AppServiceProvider 中完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2020-05-06
相关资源
最近更新 更多