wire:submit на тегу <form> перехоплює відправку форми й викликає метод компонента замість звичайного POST-запиту з перезавантаженням сторінки.
new class extends Component {
public string $title = '';
public string $content = '';
public function save(): void
{
$validated = $this->validate([
'title' => 'required|min:3',
'content' => 'required',
]);
auth()->user()->posts()->create($validated);
$this->redirectRoute('posts.index');
}
};
<form wire:submit="save">
<input type="text" wire:model="title">
<textarea wire:model="content"></textarea>
<button type="submit">Опублікувати</button>
</form>
Що робить Livewire автоматично:
preventDefault()- модифікатор.preventне потрібен, на відміну від інших подій;- блокує форму на час запиту: кнопки відправки стають неактивними, поля - доступними лише для читання. Подвійне натискання не створить два пости;
- значення з
wire:modelпотрапляють на сервер разом із запитом на відправку - окремі запити на кожне поле не потрібні.
Параметри методу можна передати прямо в директиві: wire:submit="save('draft')".
Чому type="submit" важливий: кнопка без типу всередині форми теж відправляє її, а кнопка «Скасувати» з wire:click усередині форми має бути type="button", інакше натискання на неї відправить форму.
Enter у полі відправляє форму, як у звичайному HTML, - це правильна поведінка для доступності, і її не варто ламати.
Порівняно з контролером: логіка така сама - валідація, авторизація, збереження, редирект, - але без окремого маршруту й з помилками валідації, що з'являються без перезавантаження сторінки. Метод save() - публічна дія, яку можна викликати з браузера будь-коли, тож перевірки прав мають бути всередині нього.