Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

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() сервіс-провайдера.

Докладніше в документації: View Composers

Обидва викликаються однаково - <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 - для динамічних частин скрипти підключають інакше.

Докладніше в документації: Стеки