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.

    Latest Posts

    View All

    Implement Laravel Search in a Right Way

    Implement Laravel Search in a Right Way

    Installing FreeSWITCH 1.10.X on Ubuntu 18.04 | 20.04 | 22.04 LTS

    Installing FreeSWITCH 1.10.X on Ubuntu 18.04 | 20.04 | 22.04 LTS

    Introducing the Laravel AI SDK β€” Build Smarter Apps with AI

    Introducing the Laravel AI SDK β€” Build Smarter Apps with AI

    Laravel AI SDK: Building AI-Powered Applications the Laravel Way

    Laravel AI SDK: Building AI-Powered Applications the Laravel Way

    Getting Started with Mago – The Fastest PHP Tooling Chain

    Getting Started with Mago – The Fastest PHP Tooling Chain

    Best Stack Recommendations for Laravel Projects (Battle-Tested in Production)

    Best Stack Recommendations for Laravel Projects (Battle-Tested in Production)

    Laravel + React Authentication the Right Way: Sanctum, JWT, or Passport?

    Laravel + React Authentication the Right Way: Sanctum, JWT, or Passport?

    Laravel PDF Generator: Spatie Laravel PDF vs Laravel DomPDF (In-Depth Comparison)

    Laravel PDF Generator: Spatie Laravel PDF vs Laravel DomPDF (In-Depth Comparison)

    how to systematically optimize Laravel databases in production

    how to systematically optimize Laravel databases in production

    Optimize Images in Laravel with Intervention Image

    Optimize Images in Laravel with Intervention Image