Метод composer
Метод composer класса View позволяет привязать данные к представлению, которые будут доступны всегда при его отображении. Первым параметром передаётся имя представления или массив представлений, вторым - замыкание или имя класса композера. Замыкание получает экземпляр представления, через который можно передать данные.
Синтаксис
<?php
view()->composer($view, $callback);
?>
Пример
Давайте зарегистрируем композер для представления 'profile' в сервис-провайдере:
<?php
namespace AppProviders;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
View::composer('profile', function ($view) {
$user = auth()->user();
$view->with('user', $user);
});
}
}
?>
Теперь в представлении 'profile' будет доступна переменная 'user':
<p>
Welcome, {{ $user->name }}
</p>
Пример
Давайте привяжем композер к нескольким представлениям сразу:
<?php
namespace AppProviders;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
View::composer(['profile', 'dashboard'], function ($view) {
$user = auth()->user();
$view->with('user', $user);
});
}
}
?>
Пример
Давайте используем класс композера для более сложной логики:
<?php
namespace AppHttpViewComposers;
use Illuminate\View\View;
use AppModels\User;
class ProfileComposer
{
public function compose(View $view): void
{
$user = auth()->user();
$posts = $user->posts()->latest()->get();
$view->with('user', $user)
->with('posts', $posts);
}
}
?>
Регистрация класса в сервис-провайдере:
<?php
namespace AppProviders;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use AppHttpViewComposersProfileComposer;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
View::composer('profile', ProfileComposer::class);
}
}
?>
Результат в представлении:
<h1>Welcome, {{ $user->name }}</h1>
<ul>
@foreach ($posts as $post)
<li>{{ $post->title }}</li>
@endforeach
</ul>
Пример
Давайте зарегистрируем композер для всех представлений в папке 'admin':
<?php
namespace AppProviders;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
View::composer('admin.*', function ($view) {
$notifications = auth()->user()->unreadNotifications;
$view->with('notifications', $notifications);
});
}
}
?>