Кроме обычной передачи данных из контроллера в определенный шаблон, например:
return view('index', [
'students' => $results,
]);
иногда появляется необходимость передачи одних и тех же данных сразу в несколько шаблонов или даже во все. Примером может быть меню для сайта, которое необходимо на всех страницах. Задачу можно реализовать по разному, например прописать подключение каждого шаблона в главном контроллере, который будет содержать общие данные (то же меню) и при этом каждый дочерний контроллер будет передавать ему свои данные для вывода и название своего шаблона. Но есть и другие варианты о которых ниже.
Что бы передать переменные с данными во все или в несколько нужных видов можно разместить определенный код в методе boot сервис-провайдеров. Если передается много данных, то лучше создать отдельный сервис-провайдер, например ComposerServiceProvider в папке с другими провайдерами (app\Providers).
Если отдельный сервис-провайдер не создается, то лучше использовать AppServiceProvider.
1. Просто передать переменную во ВСЕ виды:
Illuminate\Support\Facades\View::share('key', 'value');
2. Выполнить анонимную функцию:
/*
* С использованием анонимной функции
*/
View::composer('*', function ($view) {
//можно выполнить любой код
//можно вызвать метод нужного объекта
//можно передать переменные в вид:
$view->with('key', 'value');
});
* - значит выполнить функцию перед выводом ВСЕХ шаблонов. Можно указать массив с названиями НУЖНЫХ шаблонов, например:
['profile', 'dashboard']
3. Использовать метод compose вызываемого класса. В названии таких классов, рекомендуют писать окончание "Composer", например "ProfileComposer".
С начала нужно зарегистрировать класс в методе boot сервис-провайдере:
View::composer(
'*', 'App\Http\ViewComposers\ProfileComposer'
);
Как и в примере выше, звездочка значит – вызывать перед всеми шаблонами, можно указать массив нужных.
Перед началом отображения шаблона композер вызовет метод compose с экземпляром Illuminate\View\View в качестве первого параметра. Можно использовать метод with для передачи данных в шаблон.
Для таких классов можно создать отдельную папку в app\Http\ViewComposers.
Пример такого класса:
users = $users;
}
/**
* Bind data to the view.
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
Все композеры подключаются через сервис контейнер, поэтому можно применить любое внедрение зависимостей внутри конструктора композера.
Комментарии