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 →
Laravel Starter Kits Now Ship with Vite+ image

Laravel Starter Kits Now Ship with Vite+

Read article
Pessimistic Locking in Laravel Eloquent with refreshForUpdate() image

Pessimistic Locking in Laravel Eloquent with refreshForUpdate()

Read article
Mask Query Bindings in Laravel Exception Messages image

Mask Query Bindings in Laravel Exception Messages

Read article
whereBinary(): Case-Sensitive MySQL Queries in Laravel image

whereBinary(): Case-Sensitive MySQL Queries in Laravel

Read article
Compile PHP to Native Binaries with TypePHP image

Compile PHP to Native Binaries with TypePHP

Read article
State of Laravel 2026 Survey Is Now Open image

State of Laravel 2026 Survey Is Now Open

Read article