Simplifying Form Validation with Laravel Livewire's #[Validate] Attribute
Last updated on by Harris Raftopoulos
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.