Livewire 3 : validation avec l’attribut #[Validate]
DOG&DEV · 25/01/2025
Livewire 3 : validation avec l’attribut #[Validate]
En Livewire 3, l’attribut #[Validate] permet d’attacher les règles de validation directement à une propriété du composant, au lieu de centraliser tout dans un tableau $rules. Les règles et messages sont co-localisés avec les champs, ce qui simplifie la lecture et la maintenance. Ce guide présente la syntaxe, les messages personnalisés, les tableaux et le lien avec $this->validate(), ainsi que les cas où $rules reste pertinent.
Prérequis
- Livewire 3.x
- Composant avec propriétés publiques utilisées dans des formulaires
1. Règles inline
use Livewire\Attributes\Validate;
#[Validate('required|string|min:3')]
public $name = '';
Si la propriété est utilisée avec wire:model et que vous appelez $this->validate() (ou une méthode qui le fait), ces règles sont appliquées pour name.
2. Message personnalisé
#[Validate('required|min:2', message: 'Le nom doit faire au moins 2 caractères.')]
public $name = '';
3. Plusieurs règles et messages
Pour des règles complexes (tableaux, règles imbriquées) :
#[Validate(
rules: [
'tags' => 'required|array|min:1',
'tags.*' => 'string|max:50',
],
message: [
'tags.required' => 'Ajoutez au moins un tag.',
'tags.*.max' => 'Chaque tag ne doit pas dépasser 50 caractères.',
]
)]
public $tags = [];
4. Exemple : formulaire de profil
use Livewire\Component;
use Livewire\Attributes\Validate;
class ProfileForm extends Component
{
#[Validate('required|string|min:3')]
public $name = '';
#[Validate('required|email')]
public $email = '';
#[Validate('nullable|image|max:2048')]
public $avatar;
public function save()
{
$data = $this->validate();
auth()->user()->update($data);
session()->flash('success', 'Profil mis à jour.');
}
public function render()
{
return view('livewire.profile-form');
}
}
$this->validate() sans argument utilise les #[Validate] (et éventuellement $rules) pour valider les propriétés concernées. $data contient les valeurs validées (après nettoyage, etc.).
5. Règles conditionnelles
Les règles Laravel conditionnelles restent utilisables : required_if, sometimes, required_with, etc. On peut les passer en tableau :
#[Validate(['required', 'string', 'min:8', 'required_if:step,2'])]
public $password = '';
(Adapter la logique à votre composant : step peut être une autre propriété.)
6. Quand garder $rules
$rules reste utile si vous avez besoin de :
- générer les règles dynamiquement (selon la BDD, les rôles, la config) ;
- tout centraliser dans une seule propriété pour un composant très gros ;
- des règles multi-champs ou des schémas de validation très complexes qui s’expriment mal en un attribut par propriété.
Sinon, #[Validate] sur chaque propriété donne une vue plus claire de ce qui est attendu.
Dépannage
| Symptôme | Cause possible | Correctif |
|---|---|---|
| Règles non prises en compte | $this->validate() jamais appelé ou propriété absente de la validation |
Appeler $this->validate() dans la méthode qui soumet (ex. save) ; s’assurer que la propriété est bien utilisée (wire:model) |
| Erreur de syntaxe sur #[Validate] | Mauvaise utilisation de rules / message (noms, tableaux) |
Vérifier la signature : rules et message en tableaux ; noms des clés cohérents avec les propriétés |
| Conflit avec $rules | Même propriété dans $rules et #[Validate] |
Choisir un seul des deux pour une propriété ; en cas de merge, vérifier la doc Livewire pour l’ordre de priorité |
Bonnes pratiques
- Une propriété, un
#[Validate]pour les champs simples ; utiliserrules+messagepour les champs imbriqués ou les listes. - Messages en français (ou i18n) pour une meilleure UX.
- Pour les fichiers (
avatar),nullable|image|max:2048(ou autre) ; gérer le temporaire (Livewire Upload) si besoin.
Ressources
Cet article s’inscrit dans notre série de guides technique et développement web. Pour un serveur ou une application sur-mesure, contact.