Middle: питання на співбесіді з теми «Blade»
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
3 питання
View Composer прив'язує дані до шаблону щоразу, коли той рендериться - щоб не дублювати передачу спільних даних у багатьох контролерах.
View::composer('partials.sidebar', function ($view) {
$view->with('categories', Category::all());
});
Тепер будь-яке відображення partials.sidebar автоматично отримає $categories. Зручно для меню, лічильників, віджетів у layout. Реєструється у boot() сервіс-провайдера.
Обидва викликаються однаково - <x-alert type="error" />. Різниця в тому, де живе логіка.
Анонімний компонент - лише шаблон у resources/views/components:
{{-- components/alert.blade.php --}}
@props(['type' => 'info'])
<div {{ $attributes->class(['alert', 'alert-'.$type]) }}>
{{ $slot }}
</div>
@props оголошує дані; решта атрибутів потрапляє в $attributes.
Компонент з класом - php artisan make:component Alert створює клас і шаблон:
class Alert extends Component
{
public function __construct(public string $type = 'info', private Formatter $formatter) {}
public function isUrgent(): bool
{
return $this->type === 'error';
}
public function render(): View
{
return view('components.alert');
}
}
Публічні властивості й методи доступні в шаблоні, а конструктор отримує залежності з контейнера.
Коли що:
- анонімний - для презентаційних компонентів: кнопки, картки, поля форм. Їх більшість;
- з класом - коли потрібні залежності, обчислення чи метод
shouldRender().
Спільне для обох: слоти ($slot, іменовані <x-slot:title>), злиття атрибутів (merge, class), @aware для даних батьківського компонента.
Через стеки: макет оголошує місце, сторінки й компоненти додають туди вміст.
{{-- layouts/app.blade.php --}}
<head>
@vite(['resources/css/app.css', 'resources/js/app.js'])
@stack('scripts')
</head>
{{-- сторінка зі графіком --}}
@push('scripts')
<script src="https://cdn.example.com/chart.js" defer></script>
@endpush
Корисні варіанти:
@prepend- додати на початок стека;@pushOnce('scripts')- додати лише раз, навіть якщо компонент з цим скриптом стоїть на сторінці десять разів;@once ... @endonce- те саме для довільного блоку;@pushIf($condition, 'scripts')- за умовою.
Чим це краще за @section: секцію перезаписує дочірній шаблон, а в стек можуть додавати кілька незалежних місць - сторінка, кожен компонент, вкладений шаблон.
Порядок: стек виводиться там, де стоїть @stack, а вміст збирається з усіх шаблонів, що рендеряться для сторінки. Компонент, відрендерений пізніше за @stack (наприклад, у Livewire-оновленні), уже не потрапить у head - для динамічних частин скрипти підключають інакше.