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

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

Md. Mostafijur RahmanMMd. Mostafijur Rahman

Md. Mostafijur Rahman

β€’1 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.

Md. Mostafijur RahmanMMd. Mostafijur Rahman

WRITTEN BY

Md. Mostafijur Rahman

    Latest Posts

    View All

    Safe Tenant Isolation in Laravel Multi Database Apps

    Safe Tenant Isolation in Laravel Multi Database Apps

    Handling Concurrent Writes with Laravel Pessimistic Locking

    Handling Concurrent Writes with Laravel Pessimistic Locking

    Hardening a Linux VPS with Custom Port and Keys

    Hardening a Linux VPS with Custom Port and Keys

    Next.js Server Actions Concurrency and Stale Data

    Next.js Server Actions Concurrency and Stale Data

    FastAPI Dependency Injection Scope Leaks in Production

    FastAPI Dependency Injection Scope Leaks in Production

    Mastering Next.js Streaming and Suspense

    Mastering Next.js Streaming and Suspense

    Preventing Race Conditions in Laravel Seeders

    Preventing Race Conditions in Laravel Seeders

    Linux Sysctl Tuning for High-Throughput Web Servers

    Linux Sysctl Tuning for High-Throughput Web Servers

    Local Embedding Models in Production RAG

    Local Embedding Models in Production RAG

    Preventing nextjs middleware cache poisoning

    Preventing nextjs middleware cache poisoning