Об'єкт форми - окремий клас, куди виносять поля, правила валідації й логіку збереження. Компонент стає коротшим, а форму можна використати в кількох компонентах.
php artisan livewire:form PostForm # app/Livewire/Forms/PostForm.php
namespace App\Livewire\Forms;
use App\Models\Post;
use Illuminate\Validation\Rule;
use Livewire\Form;
class PostForm extends Form
{
public ?Post $post = null;
public string $title = '';
public string $content = '';
protected function rules(): array
{
return [
'title' => ['required', 'max:255', Rule::unique('posts')->ignore($this->post)],
'content' => ['required', 'min:10'],
];
}
public function setPost(Post $post): void
{
$this->post = $post;
$this->fill($post->only(['title', 'content']));
}
public function save(): Post
{
$this->validate();
$post = $this->post ?? new Post(['author_id' => auth()->id()]);
$post->fill($this->only(['title', 'content']))->save();
return $post;
}
}
Компоненти створення й редагування:
// створення
public PostForm $form;
public function save(): void
{
$post = $this->form->save();
$this->redirectRoute('posts.show', $post);
}
// редагування
public function mount(Post $post): void
{
$this->authorize('update', $post);
$this->form->setPost($post);
}
У шаблоні поля адресуються через назву властивості з формою:
<input wire:model="form.title">
@error('form.title') <p>{{ $message }}</p> @enderror
Корисні методи форми: $this->form->all(), only([...]), reset() (повертає значення за замовчуванням), pull() (отримати значення й одразу скинути), validate().
Що варто знати:
- ключі помилок мають префікс назви властивості:
form.title, а неtitle- і в@error, і в тестах (assertHasErrors('form.title')); - хуки
updated...працюють і всередині об'єкта форми; - авторизація лишається в компоненті чи в методі форми - об'єкт форми не робить дії безпечними сам по собі;
reset()повертає типізовані властивості без значення за замовчуванням у неініціалізований стан - полям варто задавати значення за замовчуванням.
Аналог у звичайному Laravel - Form Request, але об'єкт форми ще й тримає стан між запитами компонента.