Laravel 5.6 проблема с идентификатором авторизации

Я хочу передать идентификатор пользователя в функции boot класса AppServiceProvider (как написано в документах), но по какой-то причине объект Auth::user() пуст.

myAppName / app / Providers / AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL;

use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Auth;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
        URL::forceScheme('https');
        View::share('user_info', Auth::user());
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

А затем в каком-то шаблоне лезвия:

<p>{{ $user_info->id }}</p>

В результате возникает ошибка:

Trying to get property 'id' of non-object

Такая же ошибка возникает, если вы хотите передать Auth::user()->id.

Как заставить работать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
602
3

Ответы 3

Laravel blade имеет доступ к текущему аутентифицированному пользователю, вам не нужно явно использовать view :: share для этого.

Вы можете просто получить доступ к пользователю авторизации в блейде как:

{{ Auth::user()->id }}

Вы можете проверить, аутентифицирован ли пользователь уже с помощью помощника @guest или метода проверки подлинности:

@if (Auth::check())
  // authenticated
  {{ Auth::user()->id }}
@else
  // Not authenticaed
@endif

Кроме того, на слое auth()->user() отсутствует ServiceProvider. См. Жизненный цикл laravel: laravel.com/docs/5.6/lifecycle

GONG 31.07.2018 05:49

Спасибо! Хорошо, но что, если я хочу получить некоторые данные, например, из таблицы user_gruops, которая связана с таблицей users с помощью id? Думаю, было бы удобно разместить все данные о пользователях в одном месте и назначить конкретную переменную, а затем использовать ее в шаблонах.

mr.boris 31.07.2018 10:30

по соображениям безопасности Laravel ServiceProvider не имеет доступа к сеансу. И после входа в систему laravel поддерживает текущего пользователя в сеансе. Вот почему вы получаете эту ошибку.

Для вашей проблемы вы можете поделиться переменной в конструкторе класса Controller (App / Http / Controllers / Controller.php).

Что-то вроде этого:

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function __construct()
    {
        view()->share('user',auth()->user());
    }
}

Все контроллеры в Laravel по умолчанию расширяют этот класс. Тогда вам просто нужно выполнить конструктор родительского класса следующим образом:

class HomeController extends Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}

Еще одна вещь, сессия по умолчанию, также не может быть передана в конструктор. Вы должны включить его, добавив эти две строки в массив $ middleware класса App / Http / Kernel.php.

class Kernel extends HttpKernel
{
    protected $middleware = [
       //
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
       //
    ];
}

Убедитесь, что вы удаляете эти две строки из массива $ middlewareGroups. Удачи !!!

Спасибо за ваш ответ. По соображениям безопасности в документации нет объяснения, как делиться данными аутентификации (шучу). На самом деле это не решение, потому что для этого требуется конструктор выполнения родительского класса в каждом контроллере, где используется эта общая переменная. Похоже, еще один костыль. После некоторых поисков я понял, что эта проблема в Laravel - своего рода боль. Какая жалость. Я начал искать какой-нибудь другой фреймворк.

mr.boris 31.07.2018 10:58

Это решение, просто нужно добавить View Composer к AppServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL;

use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Auth;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        view()->composer('layouts.navbar', function($view) {

           $view->with('user_id', Auth::user()->id);

        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Затем просто поместите переменную в шаблон navbar следующим образом: <p>{{ $user_id }}</p>

Пояснение здесь

Другие вопросы по теме