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

laravelcloud logo
Laravel Cloud

Easily create and manage your servers and deploy your Laravel applications in seconds.

Visit Laravel Cloud

The latest

View all →
Validate and Convert HEIC Images in Laravel image

Validate and Convert HEIC Images in Laravel

Read article
Saga Lara Flow: Durable Workflows and Compensating Transactions on Laravel Queues image

Saga Lara Flow: Durable Workflows and Compensating Transactions on Laravel Queues

Read article
Reject Unexpected Array Keys with Laravel Validation image

Reject Unexpected Array Keys with Laravel Validation

Read article
Major performance improvements & security patches for Filament v4.12 and v5.7! image

Major performance improvements & security patches for Filament v4.12 and v5.7!

Read article
Laravel Boost Project Rules: Teach Agents Your Conventions image

Laravel Boost Project Rules: Teach Agents Your Conventions

Read article
Extract an Image's Dominant Color in Laravel image

Extract an Image's Dominant Color in Laravel

Read article