Laravel Tutorials

Simplifying Form Validation with Laravel Livewire's #[Validate] Attribute

Published
Simplifying Form Validation with Laravel Livewire's #[Validate] Attribute image

Laravel Livewire v3 introduced the #[Validate] attribute, transforming how developers handle form validation within components. This powerful feature enables validation rules to be declared directly on component properties, creating cleaner and more maintainable code structures.

The #[Validate] attribute eliminates the traditional need for separate $rules arrays by co-locating validation logic with property declarations. This approach provides immediate clarity about what validation constraints apply to each field.

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');
    }
}

The attribute supports various configurations including custom error messages, attribute naming, and conditional validation scenarios. You can customize validation messages directly within the attribute declaration:

#[Validate('required|min:2', message: 'Username must be at least 2 characters')]
public $username = '';

For complex validation requirements, array syntax provides additional flexibility:

#[Validate([
    'tags' => 'required|array',
    'tags.*' => 'string|max:50'
], message: [
    'tags.required' => 'Please add at least one tag',
    'tags.*.max' => 'Each tag must be under 50 characters'
])]
public $tags = [];

Consider building an event registration system where different validation rules apply based on event type. The #[Validate] attribute streamlines this complex scenario by keeping validation logic adjacent to the relevant properties.

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');
    }
}

This registration component demonstrates how #[Validate] handles different validation scenarios including conditional requirements and boolean fields. The dietary_requirements field only becomes mandatory when the event type is 'conference', showcasing the attribute's flexibility for dynamic validation rules.

The #[Validate] attribute compiles efficiently at runtime, maintaining performance while improving code readability. For applications requiring extensive validation logic or custom rule objects, traditional validation methods remain available as complementary approaches.

Harris Raftopoulos photo

Senior Software Engineer • Staff & Educator @ Laravel News • Co-organizer @ Laravel Greece Meetup

Sponsored

serpapi logo
SerpApi

The Web Search API for Your LLM and AI Applications

Visit SerpApi

The latest

View all →
Slow Job Alerts and Replica Commit IDs in Laravel 13.40 image

Slow Job Alerts and Replica Commit IDs in Laravel 13.40

Read article
Flock: A Free, Native Herd Alternative for Laravel image

Flock: A Free, Native Herd Alternative for Laravel

Read article
Live Props for Real-Time Updates in Inertia.js v3.11 image

Live Props for Real-Time Updates in Inertia.js v3.11

Read article
Cooldown Dependency Policy now in Composer 2.11 image

Cooldown Dependency Policy now in Composer 2.11

Read article
Email Sending and Testing for Laravel in One Account image

Email Sending and Testing for Laravel in One Account

Read article
Decide with Jev: Tie Every AI Check to the Exact Draft image

Decide with Jev: Tie Every AI Check to the Exact Draft

Read article