Tech Verse Logo
Enable dark mode
Simplifying Form Validation with Laravel Livewire's #[Validate] Attribute

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

Tech Verse Daily

Tech Verse Daily

β€’4 min read

Livewire v3’s #[Validate] attribute is one of those changes that looks small but really shifts how we structure components. Instead of juggling a big $rules array at the bottom of your class (where you constantly scroll back and forth to see which property it applies to), the rules now live with the property itself β€” much closer to how we think about form data in real-world components.

Here are some practical highlights worth noting:

πŸ”‘ Key Benefits

  1. Co-located rules β†’ You don’t have to mentally map rules to properties; the contract is right there.

  2. Cleaner components β†’ No more giant $rules arrays cluttering your class.

  3. Custom messages inline β†’ Error messages live next to the property, easier to maintain.

  4. Conditional validation β†’ Still supports required_if, sometimes, and even complex nested rules.

  5. Array support β†’ Perfect for collections like tags, checklists, or dynamic form fields.

πŸ›  Usage Patterns

Inline validation

#[Validate('required|string|min:3')]
public $name = '';

With custom message

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

With multiple rules & messages

#[Validate(
    rules: [
        'tags' => 'required|array|min:1',
        'tags.*' => 'string|max:50'
    ],
    message: [
        'tags.required' => 'Please add at least one tag',
        'tags.*.max' => 'Tags may not exceed 50 characters'
    ]
)]
public $tags = [];

πŸš€ Real-World Example: User Profile Form

class ProfileForm extends Component
{
    #[Validate('required|string|min:3')]
    public $name = '';

    #[Validate('required|email|unique:users,email')]
    public $email = '';

    #[Validate('nullable|image|max:2048')]
    public $avatar;

    public function save()
    {
        $data = $this->validate();

        auth()->user()->update($data);

        session()->flash('success', 'Profile updated successfully!');
    }

    public function render()
    {
        return view('livewire.profile-form');
    }
}

βš–οΈ When to Still Use $rules

  • When you need to dynamically generate rules (e.g., based on DB values or permissions).

  • If you prefer having all rules centralized in one place (some teams like the overview).

  • For very complex multi-field validations that may feel verbose inline.