
return view('search.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.
Пример такого класса:
<?php namespace App\Http\ViewComposers; use Illuminate\View\View; use App\Repositories\UserRepository; class ProfileComposer { /** * The user repository implementation. * * @var UserRepository */ protected $users; /** * Create a new profile composer. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { // Dependencies automatically resolved by service container... $this->users = $users; } /** * Bind data to the view. * * @param View $view * @return void */ public function compose(View $view) { $view->with('count', $this->users->count()); } }
Все композеры подключаются через сервис контейнер, поэтому можно применить любое внедрение зависимостей внутри конструктора композера.