doganddev
Accueil Blog Boutique

Livewire 3 : validation avec l’attribut #[Validate]

DOG&DEV · 25/01/2025

Automatisation Backups
Livewire 3 : validation avec l’attribut #[Validate]

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 ; utiliser rules + message pour 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.

Commentaires (0)

Laisser un commentaire