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 →
Fresh Package: Laravel Package Skeleton with Testbench, CI, and Boost Integration image

Fresh Package: Laravel Package Skeleton with Testbench, CI, and Boost Integration

Read article
Inertia DevTools Now Available for Firefox image

Inertia DevTools Now Available for Firefox

Read article
Laravel Scalpel Scans for Filesystem Intrusion Evidence image

Laravel Scalpel Scans for Filesystem Intrusion Evidence

Read article
Mercure Broadcasting in Laravel 13.32 image

Mercure Broadcasting in Laravel 13.32

Read article
Super Stack: Laravel Starter Kit With Filament and NativePHP image

Super Stack: Laravel Starter Kit With Filament and NativePHP

Read article
Laravel MCP 1.0 Is Released image

Laravel MCP 1.0 Is Released

Read article