Директива inject
Директива inject позволяет получить экземпляр класса из сервис-контейнера Laravel прямо в шаблоне. Это удобно, когда нужно использовать данные из сервиса без создания отдельного контроллера или view-композера. Первым параметром передаётся имя переменной, в которую будет помещён объект, вторым - имя класса или его привязка в контейнере. Директива разрешается в момент компиляции шаблона.
Синтаксис
@inject($variable, 'service.bind')
@inject($variable, App\Services\SomeService::class)
Пример
Давайте получим список статей через сервис и выведем их в шаблоне:
@inject($articleService, App\Services\ArticleService::class)
<h1>Article list</h1>
<ul>
@foreach ($articleService->getAll() as $article)
<li>{{ $article->title }}</li>
@endforeach
</ul>
Результат выполнения кода:
<h1>Article list</h1>
<ul>
<li>First article</li>
<li>Second article</li>
<li>Third article</li>
</ul>
Пример
Давайте внедрим сервис с привязкой в контейнере. Предположим, что в сервис-провайдере зарегистрирован интерфейс:
<?php
use App\Interfaces\DataProviderInterface;
use App\Services\DatabaseDataProvider;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->bind(DataProviderInterface::class, DatabaseDataProvider::class);
}
}
?>
А затем используем его в шаблоне:
@inject($dataProvider, App\Interfaces\DataProviderInterface::class)
<div class="dashboard">
<h2>Stats</h2>
@foreach ($dataProvider->getStats() as $stat)
<p>{{ $stat->label }}: {{ $stat->value }}</p>
@endforeach
</div>
Результат выполнения кода:
<div class="dashboard">
<h2>Stats</h2>
<p>Total users: 100</p>
<p>Active users: 75</p>
<p>New users: 10</p>
</div>
Пример
Рассмотрим пример, где в шаблоне внедряется несколько сервисов одновременно:
@inject($userService, App\Services\UserService::class)
@inject($settingsService, App\Services\SettingsService::class)
<div>
@if ($userService->isAdmin())
<a href="/admin">Admin panel</a>
@endif
@if ($settingsService->get('show_sidebar'))
<aside>Sidebar content</aside>
@endif
</div>
Результат выполнения кода для администратора:
<div>
<a href="/admin">Admin panel</a>
<aside>Sidebar content</aside>
</div>