Композеры (view composers) - функции-замыкания или методы класса, которые вызываются, когда шаблон рендерится в строку. Если имеются данные, которые необходимо привязать к шаблону при каждом его рендеринге, то композеры помогут вам выделить такую логику в отдельное место.
Регистрировать композеры можно внутри сервис-провайдера. Мы будем использовать фасад View для того, чтобы получить доступ к имплементации контракта Illuminate\Contracts\View\Factory:
Определение композера. Листинг 3.1 |
<?php namespace App\Providers; use View; use Illuminate\Support\ServiceProvider; use App\Http\ViewComposers\SiteComposer; class ComposerServiceProvider extends ServiceProvider { public function boot() { View::composer('*', 'App\Http\ViewComposers\SiteComposer'); } public function register() { // } } |
Файл композера необходимо зарегистрировать в config/app.php
Регистрация файла композера. Листинг 3.2 |
'App\Providers\ComposerServiceProvider', |
Определение класса SiteComposer:
Класс SiteComposer. Листинг 3.3 |
<?php namespace App\Http\ViewComposers; use Illuminate\Contracts\View\View; class SiteComposer { public function compose(View $view) { $view->with('menu_items',’TEST’); } } |
Метод compose должен получать в качестве аргумента инстанс Illuminate\Contracts\View\View. Для передачи переменных в шаблон используйте метод with().
Назначение композера для нескольких шаблонов
Вместо имени шаблона можно использовать массив имен.
Назначение композера для нескольких шаблонов. Листинг 3.4 |
View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer'); |
Композер для всех шаблонов
А вот так можно назначить композер для всех шаблонов:
Назначение композера для всех шаблонов. Листинг 3.5 |
View::composer('*', function() { // }); |
Регистрация нескольких шаблонов
Можно использовать метод composers, чтобы зарегистрировать несколько композеров одновременно:
Регистрация нескольких шаблонов одновременно. Листинг 3.5 |
View::composers([ 'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'], 'App\Http\ViewComposers\UserComposer' => 'user', 'App\Http\ViewComposers\ProductComposer' => 'product' ]); |