Laravel – Как получить текущего пользователя в AppServiceProvider

Поэтому я обычно получаю текущего пользователя, используя Auth::user(), и когда я определяю, действительно ли пользователь вошел в систему, Auth::check. Однако это, похоже, не работает в моем AppServiceProvider. Я использую его для обмена данными во всех представлениях. Я var_dump и Auth::user() и Auth::check() во время входа в систему, и я получаю NULL и false.

Как я могу получить текущего пользователя внутри моего 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'));
    }

person Codearts    schedule 22.05.2016    source источник
comment
Для этого вам необходимо создать собственное промежуточное ПО, см. обсуждения: laracasts.com/discuss/channels/laravel/, github.com/laravel/framework/issues/7906   -  person Burak    schedule 22.05.2016


Ответы (3)


Сеанс 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 );    
    });  
}

Обратный вызов будет выполняться только тогда, когда представление фактически создается, поэтому промежуточное ПО уже будет выполнено, и сеанс будет доступен.

person Moppo    schedule 22.05.2016
comment
Просто примечание: я пытался сделать это сегодня (Laravel 5.4), и это не сработает с закрытием, как указано в этом ответе. Предоставление имени класса внешнему объекту, например. view()->composer('*', \App\Http\ViewComposers\MyComposer::class) был единственным способом заставить его распознавать Auth::user() как что угодно, кроме null. - person miken32; 19.08.2018
comment
как я могу добиться того же при использовании API, так как они не используются блейд/представлением при использовании API Laravel - person Abhi Burk; 20.07.2020

В функции boot() AuthServiceProvider напишите эти строки кода

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

Здесь * означает, что во всех ваших представлениях доступна $currentUser переменная.

Затем из файла просмотра {{ currentUser }} вы получите информацию о пользователе, если пользователь аутентифицирован, иначе null.

person Maniruzzaman Akash    schedule 14.12.2017
comment
Я хочу поделиться данными своей корзины со всеми страницами, это мне очень помогло - person Rishi; 26.12.2018
comment
Хорошее решение, хотя я бы посоветовал не указывать AuthServiceProvider, поскольку boot() следует ограничить регистрацией служб аутентификации и авторизации. Может AppServiceProvider или даже ComposerServiceProvider? - person simonw16; 12.03.2019
comment
как я могу добиться того же при использовании API, так как они не используются блейд/представлением при использовании API Laravel - person Abhi Burk; 20.07.2020
comment
@AbhiBurk в API, вам обязательно нужно передать токен для получения данных. Я не уверен, что это можно сделать в AppServiceProvider. - person Maniruzzaman Akash; 20.07.2020

Судя по моему опыту работы с 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]);
            });
        }
    }
person Dinesh Suthar    schedule 05.06.2021