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