#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, поэтому, если пользователь хочет видеть больше уведомлений, он может сделать это двумя способами, сначала нажав кнопку «Загрузить больше» или нажав кнопку «Просмотреть все уведомления», затем я отправляю его в одно представление со всеми пользователями уведомлений.
Таким образом, вам нужно загрузить скрипт только в конце вашего плана, и он всегда будет работать.