Спрощення валідації форм за допомогою атрибута #[Validate] у Laravel Livewire

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 05 вересня, 2025
Laravel Livewire v3 представив атрибут #[Validate], який кардинально змінює підхід до валідації форм у компонентах. Чи готові ви дізнатися, як цей інноваційний засіб дозволяє зменшити обсяг коду та підвищити його читабельність? Читайте далі, щоб дізнатися, як зробити вашу валідацію ще ефективнішою

Laravel Livewire v3 представив атрибут #[Validate], який революціонізує підходи до валідації форм у компонентах. Ця потужна можливість дозволяє заявляти правила валідації безпосередньо на властивостях компонента, що робить код більш зрозумілим та легким для підтримки.

Атрибут #[Validate] усуває необхідність у традиційних масивах $rules, об'єднуючи логіку валідації з деклараціями властивостей. Це забезпечує миттєву ясність щодо умов валідації для кожного поля.

use Livewire\Component;
use Livewire\Attributes\Validate;

class UserForm extends Component
{
    #[Validate('required|string|min:2')]
    public $username = '';

    #[Validate('required|email|unique:users,email')]
    public $email = '';

    public function submit()
    {
        $this->validate();

        User::create([
            'username' => $this->username,
            'email' => $this->email,
        ]);
    }

    public function render()
    {
        return view('livewire.user-form');
    }
}

Атрибут підтримує різні конфігурації, включаючи кастомні повідомлення про помилки, іменування атрибутів та умовні сценарії валідації. Ви можете налаштувати повідомлення про валідацію безпосередньо в декларації атрибута:

#[Validate('required|min:2', message: 'Ім'я користувача повинно містити щонайменше 2 символи')]
public $username = '';

Для складніших вимог до валідації синтаксис масиву надає додаткову гнучкість:

#[Validate([
    'tags' => 'required|array',
    'tags.*' => 'string|max:50'
], message: [
    'tags.required' => 'Будь ласка, додайте хоча б один тег',
    'tags.*.max' => 'Кожен тег повинен містити не більше 50 символів'
])]
public $tags = [];

Розгляньте розробку системи реєстрації на події, де застосовуються різні правила валідації залежно від типу події. Атрибут #[Validate] спрощує цей складний сценарій, зберігаючи логіку валідації поряд з відповідними властивостями.

class EventRegistration extends Component
{
    #[Validate('required|string')]
    public $participant_name = '';

    #[Validate('required|email')]
    public $participant_email = '';

    #[Validate('required|in:workshop,seminar,conference')]
    public $event_type = '';

    #[Validate('nullable|required_if:event_type,conference|string')]
    public $dietary_requirements = '';

    #[Validate('boolean')]
    public $newsletter_consent = false;

    public function register()
    {
        $validated = $this->validate();

        EventParticipant::create([
            'name' => $validated['participant_name'],
            'email' => $validated['participant_email'],
            'event_type' => $validated['event_type'],
            'dietary_requirements' => $validated['dietary_requirements'],
            'newsletter_consent' => $validated['newsletter_consent'],
        ]);

        $this->dispatch('registration-complete', name: $validated['participant_name']);
        return $this->redirect('/events/confirmation');
    }

    public function render()
    {
        return view('livewire.event-registration');
    }
}

Цей компонент реєстрації демонструє, як #[Validate] обробляє різні сценарії валідації, включаючи умовні вимоги та логічні поля. Поле dietary_requirements стає обов'язковим лише тоді, коли тип події - 'conference', що підкреслює гнучкість атрибута для динамічних правил валідації.

Атрибут #[Validate] працює ефективно в процесі виконання, зберігаючи продуктивність і покращуючи читабельність коду. Для додатків, які вимагають складної логіки валідації або кастомних правил, традиційні методи валідації залишаються доступними як доповнюючі підходи.