Главная Ларавел Laravel-5 - передача данных во все шаблоны.

Ларавел


Laravel-5 - передача данных во все шаблоны.

Кроме обычной передачи данных из контроллера в определенный шаблон, например:

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());
    }
}

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


Комментарии

  1. Василий
    21.06.2018 в 09:48

    Спасибо, очень полезная информация.

Написать комментарий