Skip to main content

Qu’est-ce qu’une règle de validation personnalisée

Laravel dispose d’un large éventail de règles de validation intégrées, mais parfois vous avez besoin d’une logique de validation spécifique à votre application. Les règles personnalisées vous permettent de définir une logique de validation réutilisable sous forme de classes ou de closures, utilisables comme les règles standards. Il existe principalement deux façons de définir des règles personnalisées :
  • Objet règle — très réutilisable et facile à tester
  • Closure — adapté aux règles simples utilisées une seule fois

Objet règle

Générer une classe de règle

La commande Artisan make:rule génère une nouvelle classe de règle. Elle est placée dans le répertoire app/Rules.

Implémenter l’interface ValidationRule

Implémentez la méthode validate dans la classe générée. Cette méthode appelle la closure $fail en cas d’échec de la validation.
La chaîne passée à la closure $fail peut contenir le placeholder :attribute, que Laravel remplace par le nom du champ.

Appliquer l’objet règle

Passez une instance de l’objet règle dans le tableau de validation.
La méthode rules() d’un form request s’utilise de la même façon.

Messages d’erreur via des clés de traduction

Plutôt que de coder en dur le message d’erreur, vous pouvez utiliser une clé de traduction.
Ajoutez le message dans le fichier de traduction lang/fr/validation.php.

Ajouter plusieurs messages d’erreur

Pour reporter plusieurs erreurs sur un même champ, appelez $fail plusieurs fois.

Règles via closure

Les règles simples utilisées une seule fois dans l’application peuvent être définies via une closure, sans créer de classe.
Les règles closure sont pratiques car définies inline, mais elles sont difficiles à réutiliser et à tester de façon isolée. Pour une logique utilisée à plusieurs endroits, préférez extraire dans un objet règle.

Règles implicites (exécutées même si la valeur est vide)

Par défaut, si un champ est vide ou absent, les règles personnalisées ne sont pas exécutées. Pour exécuter la règle même sur les valeurs vides, générez la classe avec l’option --implicit.
La classe générée implémente l’interface ImplicitRule. Cette interface elle-même n’ajoute pas de méthode ; elle sert de signal à Laravel.
ImplicitRule indique simplement à Laravel que « l’attribut est requis ». C’est à l’implémentation de validate de faire réellement échouer la validation lorsque la valeur est vide.

Accès aux données

DataAwareRule — accéder à toutes les données du formulaire

Pour valider en fonction des valeurs d’autres champs, implémentez l’interface DataAwareRule. La méthode setData est appelée automatiquement avant le démarrage de la validation.
Exemple d’utilisation :

ValidatorAwareRule — accéder à l’instance du validateur

Pour accéder à toutes les informations du validateur (règles échouées, messages personnalisés, etc.), implémentez l’interface ValidatorAwareRule.

Cas d’usage pratiques

Vérification de caractères spécifiques

Une règle qui valide un jeu de caractères précis.

Vérification d’un format de numéro de téléphone

Une règle validant le format d’un numéro de téléphone japonais.

Contrainte d’unicité avec tenant ID

Une contrainte d’unicité au sein du scope d’un tenant, courante dans les applications multi-tenant.
1

Créer la classe de règle

2

Utiliser dans une Form Request

3

Exclure l'ID lors de la mise à jour

Lors de la mise à jour d’un enregistrement existant, excluez son propre ID de la vérification de doublon.

Enregistrement de règles dans un service provider

Ajouter une règle avec Validator::extend()

Validator::extend() permet d’utiliser une règle personnalisée sous forme de chaîne ('rule_name'). Enregistrez-la dans la méthode boot() de AppServiceProvider.
Les règles enregistrées avec Validator::extend() peuvent être spécifiées comme chaîne.
Validator::extend() est une méthode d’enregistrement plus ancienne que les objets règle. Pour les nouveaux développements, il est recommandé d’utiliser des objets règle implémentant l’interface ValidationRule.

Ajouter comme méthode statique de la classe Rule

En ajoutant une macro à la façade Rule, vous pouvez fournir une API fluide comme Rule::myRule().

Détails de l’implémentation interne

Voyons comment Illuminate\Validation\Validator invoque les règles personnalisées. Au sein du validateur, validateAttribute() traite chaque champ. Si la règle implémente l’interface ValidationRule, la méthode validateUsingCustomRule() est appelée.
Le traitement de ImplicitRule est déterminé par la méthode isImplicit(), qui exécute la vérification même sur les valeurs vides.
Vous pouvez implémenter DataAwareRule et ValidatorAwareRule simultanément. Dans une classe qui implémente les deux interfaces, les deux injections sont effectuées.

Pages associées

Validation (introduction)

Consultez la méthode standard de validation dans les contrôleurs et les form requests.
Dernière modification le 13 juillet 2026