Валідація в реальному часі - перевірка поля під час заповнення форми, а не лише при відправці.
Що для цього потрібно:
- правила на властивості через
#[Validate]- Livewire перевіряє властивість при кожному оновленні з браузера; - оновлення має доходити до сервера -
wire:model.liveчиwire:model.live.blur.
#[Validate('required|email|unique:users,email')]
public string $email = '';
<input type="email" wire:model.live.blur="email">
@error('email') <p>{{ $message }}</p> @enderror
Користувач заповнив поле й перейшов до наступного - запит, перевірка, помилка з'являється одразу.
Чому не просто .live: перевірка на кожне натискання клавіші показує «Некоректна адреса», поки людина ще друкує, і створює запит на кожну паузу. Перевірка при виході з поля (.blur) - зручніша і дешевша. Виняток - поля, де миттєвий відгук корисний (сила пароля, доступність імені користувача).
Чому rules() не спрацьовує при введенні. Метод rules() застосовується лише при виклику $this->validate(). При оновленні властивості Livewire перевіряє тільки ті, що мають атрибут #[Validate]. Щоб і правила з rules() (наприклад, з об'єктами Rule::unique(), яких атрибут не дозволяє) перевірялися при введенні, додайте порожній атрибут:
#[Validate]
public string $email = '';
protected function rules(): array
{
return ['email' => ['required', 'email', Rule::unique('users')->ignore(auth()->id())]];
}
Вимкнути автоматичну перевірку для поля з атрибутом - #[Validate('required', onUpdate: false)].
Перевірити одне поле вручну: $this->validateOnly('email') у хуку updated.
Помилки в JavaScript - магічна властивість $errors:
<p wire:show="$errors.has('email')" wire:text="$errors.first('email')"></p>
Підсумкова перевірка обов'язкова: валідація в реальному часі - зручність. Перед збереженням $this->validate() все одно викликається, бо частину полів користувач міг не чіпати, а запит можна відправити й в обхід інтерфейсу.