Блог Vaden Pro

Все о самостоятельном создании и продвижении сайтов

Вставка объектов (из IOC) при помощи Laravel Blade Service Injection

Раздел: 

В Laravel 5.1 появилось достаточно много полезных новых функций, среди которых присутствует и «Service Injection»- возможность вставки объекта в Blade Templates.

Laravel Blade Service Injection

Проще говоря теперь вы можете убрать объект из 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"

Кратко о прочих нововведениях Laravel 5.1