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
Co-located rules β You donβt have to mentally map rules to properties; the contract is right there.
Cleaner components β No more giant
$rules
arrays cluttering your class.Custom messages inline β Error messages live next to the property, easier to maintain.
Conditional validation β Still supports
required_if
,sometimes
, and even complex nested rules.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.