Валідація в Livewire побудована на звичайній валідації Laravel - ті самі правила й повідомлення.
Спосіб 1 - $this->validate() з правилами:
public function save(): void
{
$validated = $this->validate([
'title' => 'required|min:3|max:255',
'email' => 'required|email',
]);
Post::create($validated);
}
Якщо дані невалідні, метод кидає виняток, виконання дії зупиняється, а помилки повертаються в браузер. validate() повертає лише перевірені поля - їх безпечно передавати в create().
Спосіб 2 - атрибут #[Validate] над властивістю:
use Livewire\Attributes\Validate;
new class extends Component {
#[Validate('required|min:3')]
public string $title = '';
#[Validate('required|email', as: 'електронна адреса')]
public string $email = '';
public function save(): void
{
$this->validate(); // правила беруться з атрибутів
}
};
Правила поруч із властивістю, і поле перевіряється автоматично при кожному оновленні з браузера (якщо воно надсилається на сервер - з .live).
Показ помилок - звичайні директиви Blade:
<input wire:model="title" @error('title') aria-invalid="true" @enderror>
@error('title')
<p class="text-sm text-red-600">{{ $message }}</p>
@enderror
Важливо: $this->validate() перед збереженням потрібен навіть з #[Validate] - атрибут перевіряє лише поля, які оновлювалися. Поле, якого користувач не торкався, без явного validate() залишиться неперевіреним.
Обмеження атрибутів: у PHP-атрибутах не можна використовувати об'єкти правил (Rule::unique(...), Password::defaults()). Для них - метод rules().
Українські повідомлення - через файли перекладів lang/uk/validation.php, як і в усьому Laravel; назву поля задає параметр as: чи метод validationAttributes().
Ручне керування помилками: $this->addError('email', 'Ця адреса вже зайнята'), $this->resetValidation('email').