В Laravel 5.1 появилось достаточно много полезных новых функций, среди которых присутствует и «Service Injection»- возможность вставки объекта в Blade Templates.
Проще говоря теперь вы можете убрать объект из IOC внутри вашего шаблона:
// Blade template @inject('service', 'App\Services\Service') {{ $service->getSomething() }}
Как Вы можете видеть, первый параметр это имя переменной, а второй- класс, имя из интерфейса или псевдоним.
На заметку: не злоупотребляйте этим. Есть такая вещь, как излишнее количество логики в Ваших представлениях, и это не есть хорошо. Но бывают ситуации, когда установка классов в каждый контроллер просто для того, чтобы передать их в то же самое представление, требует слишком много ручной работы. Подумайте о контексте в котором Вы можете пожелать воспользоваться представлением Composer, но Вам необходим лишь единичный класс и создание полного представления Composer может потребовать слишком большого количества работы.
Итак, прежде чем Вы сделали это:
// DashboardController public function index() { return view('dashboard') ->with('analytics', App::make('App\Services\Analytics')); }
// dashboard.blade.php // Template content… @include('user.partials.finances-graph', ['analytics' => $analytics]) // Template content…
// UserController public function showFinances() { return view('user.finances') ->with('analytics', App::make('App\Services\Analytics')); }
// user/finances.blade.php // Template content… @include('user.partials.finances-graph', ['analytics' => $analytics]) // Template content…
// user/partials/finances-graph.blade.php <h3>Finances</h3> <div class="finances-display"> {{ $analytics->getBalance() }} / {{ $analytics->getBudget() }} </div>
Как Вы видите, мы имеем 2 разных контроллера, используемые в двух разных шаблонах, но оба эти шаблона включают ту же самую часть шаблона, которая необходима для сервисов статистики.
Давайте изменим это. Поскольку это лишь единичный сервис, мы вставим сервис в наш шаблон вместо создания представления Composer:
// DashboardController public function index() { return view('dashboard'); }
// dashboard.blade.php // Template Content… @include('user.partials.finances-graph') // Template Content…
// UserController public function showFinances() { return view('user.finances'); }
// user/finances.blade.php // Template Content… @include('user.partials.finances-graph') // Template Content…
// user/partials/finances-graph.blade.php @inject('analytics', 'App\Services\Analytics') <h3>Finances</h3> <div class="finances-display"> {{ $analytics->getBalance() }} / {{ $analytics->getBudget() }} </div>
Вот и все. Теперь Вы профессионал по вставке сервисов.
Перевод Matt Stauffer "Injecting an object (from the IOC) using Laravel Blade Service Injection"