Laravel | Выполнение запроса для нескольких представлений без дублирования кода

#laravel #laravel-5.8

#laravel #laravel-5.8

Вопрос:

Я создаю приложение, которое запрашивает один и тот же набор команд в базе данных практически для каждого представления. Например, notifications ; Мне нужно запросить, чтобы получить все уведомления для пользователя для каждого представления, в котором пользователь вошел в систему. В контроллерах я делаю это:

 public function index() {
    $notifications = Notification::whereUserId(Auth::user()->id)->get();

    return view('home', compact('notifications'));
}
  

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

Например, получение уведомлений только в 1 файле.

Спасибо.

Ответ №1:

В boot() методе AppProvidersAppServiceProvider добавьте следующую строку:

 if(auth()->check()){
  View::share('notifications', Notification::whereUserId(auth()->id())->get());
}
  

Таким образом, notifications переменная будет использоваться совместно во всех ваших представлениях (файлах.blade).

Вместо этого, если вы хотите просто поделиться данными в некоторых конкретных представлениях, вы можете использовать view composer. Проверьте документацию здесь:https://laravel.com/docs/5.8/views#view-composers

Ответ №2:

Почему вы делаете это спереди? …. У меня похожая ситуация, у меня есть простое приложение, реализующее традиционное поведение постранично, я делаю это:

  • Моя страница загружает только необходимое, включая данные представления
  • После загрузки, с помощью Jquery (в моем случае), я получаю последние уведомления в простом компоненте через ajax, поэтому, если пользователь хочет видеть больше уведомлений, он может сделать это двумя способами, сначала нажав кнопку «Загрузить больше» или нажав кнопку «Просмотреть все уведомления», затем я отправляю его в одно представление со всеми пользователями уведомлений.

Таким образом, вам нужно загрузить скрипт только в конце вашего плана, и он всегда будет работать.