Laravel делится данными со всеми представлениями

Я пытаюсь выполнить связанный с пользователем запрос, чтобы получить данные, которые будут отображаться на верхней панели моего сайта при каждом просмотре.

Я создал новый BaseController в соответствии с первым ответом здесь:

Как передать данные во все представления в Laravel 5?

и это работает для простого теста (просто разделяя типизированную переменную), но когда я пытаюсь использовать Auth::user()->id в методе __construct BaseController (который в других моих контроллерах всегда возвращает идентификатор текущего пользователя, вошедшего в систему), я получаю Trying to get property 'id' of non-object.

Я пробовал добавить use App\User в начало BaseController (хотя обычно это не требуется), а также попытался добавить биты для плагина Spatie laravel-permission, но ни один из них не дал никакого эффекта.

Я попробовал dd на Auth::user() и получил "ноль". Мне кажется, что данные пользователя, возможно, не были загружены на этом этапе, но BaseController расширяет Controller так же, как MyWorkingController расширяет Controller, поэтому я не уверен, почему Auth::user()->id здесь не работает, когда он работает нормально?

Вы должны использовать Посмотреть композиторов. auth()->user() не будет доступен в вашем конструкторе, поскольку он пытается получить его из сеанса, который недоступен в конструкторах.

Mozammil 10.01.2019 13:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
1
3 459
5

Ответы 5

Создайте базовый контроллер, который имеет всю информацию, которую вы хотите поделиться, со всеми контроллерами / страницами / представлениями, и позвольте другим вашим контроллерам расширять ее.

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

Sam 10.01.2019 13:44

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

CritingZ 10.01.2019 13:53

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

Sam 10.01.2019 13:57

Я думаю, что где-то я использовал код, такой как Абдулла Аль Шакиб прокомментировал здесь в последнем комментарии.

CritingZ 10.01.2019 14:02

откройте файл AppServiceProvider.php из папки Providers и напишите ниже код в функции загрузки

     view()->composer('*', function ($view)
    {
        $view->with('cartItem', $cart );

    });

А теперь перейдите на страницу просмотра и напишите:

{{ $cartItem }}

$ view-> with ('cartItem', $ cart); в этой строке $ cart будет заменен вашими данными, которыми вы хотите поделиться со всеми вашими представлениями

Rishi 10.01.2019 13:47

Это сработало для простой введенной переменной, но я все еще не мог использовать Auth::user()->id для получения текущего идентификатора пользователя. Я добавил use Auth и use DB, чтобы я мог запустить свой запрос, чтобы получить информацию, но затем получил большую ошибку по поводу материала фреймворка Symfony.

Sam 10.01.2019 13:55

ты можешь использовать все, просто проверь мой второй ответ

Rishi 10.01.2019 13:59

Вы не можете получить доступ к Auth в конструкторах, потому что middleware еще не запущен. Вы можете использовать либо Посмотреть композитора, либо попробовать этот способ, хотя я не тестировал.

class BaseController extends Controller {
    protected $userId;

    public function __construct() {
        $this->middleware(function ($request, $next) {
           $this->userId= Auth::user()->id;

           return $next($request);
        });
    }
}

Предположительно тогда я бы просто использовал $userId вместо Auth::user()->id? Я попытался сделать это, но получил ошибку неопределенной переменной

Sam 10.01.2019 13:53

Напишите это в AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use DB;
use Auth;
use App\Cart;

class AppServiceProvider extends ServiceProvider
{

    public function boot()
    {
        Schema::defaultStringLength(191);

            view()->composer('*', function ($view)
            {

                view()->composer('*', function($view)
                {
                    if (Auth::check()) {
                        $cart = Cart::where('user_id', Auth::user()->user_id)->count();
                        $view->with('cartItem', $cart );
                    }else {
                        $view->with('cartItem', 0);
                    }
                });


            });

    }


}

По вашему мнению, просто напишите

{{ $cartItem }}

Кажется, это не работает, но мне пришлось отредактировать его, потому что у меня нет тележки, и, возможно, это сломала моя замена. У вас есть пример без корзины, который есть во всех установках Laravel?

Sam 10.01.2019 14:13

Для всех, кому интересно, я столкнулся с той же проблемой и решил ее с помощью ServiceProvider:

  1. Определите свой собственный ServiceProvider с помощью команды
php artisan make:provider CustomServiceProvider
  1. Добавьте ссылку на вашего поставщика услуг в файл config\app.php, в частности в массив providers, добавив к нему этот элемент:
\App\Providers\CustomServiceProvider::class,
  1. Объявите переменные, которыми вы хотите поделиться, в методе boot() вашего провайдера и поделитесь ими с помощью метода view()->share:
public function boot()
{
    $shared_variable = "Hello";

    view()->share('shared_variable', $shared_variable); 
}
  1. Теперь вы можете ссылаться на свою переменную в файлах лезвий в стандартной записи:
{{ $shared_variable }}

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