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

    Handling Large Datasets with Pagination and Cursors in Laravel MongoDB: Offset vs Cursor Pagination

    Handling Large Datasets with Pagination and Cursors in Laravel MongoDB: Offset vs Cursor Pagination

    A Complete Guide: Detecting and Fixing Race Conditions in Laravel Applications

    A Complete Guide: Detecting and Fixing Race Conditions in Laravel Applications

    PestPHP Intellisense in Laravel VS Code Extension v1.7.0

    PestPHP Intellisense in Laravel VS Code Extension v1.7.0

    Laravel Starter Kits Now Come with Built-in Toast Notifications

    Laravel Starter Kits Now Come with Built-in Toast Notifications

    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)