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 Artisanmake: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éthodevalidate dans la classe générée. Cette méthode appelle la closure $fail en cas d’échec de la validation.
$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.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.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.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.
ImplicitRule. Cette interface elle-même n’ajoute pas de méthode ; elle sert de signal à Laravel.
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’interfaceDataAwareRule. La méthode setData est appelée automatiquement avant le démarrage de la validation.
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’interfaceValidatorAwareRule.
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.
Validator::extend() peuvent être spécifiées comme chaîne.
Ajouter comme méthode statique de la classe Rule
En ajoutant une macro à la façadeRule, vous pouvez fournir une API fluide comme Rule::myRule().
Détails de l’implémentation interne
Voyons commentIlluminate\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.
ImplicitRule est déterminé par la méthode isImplicit(), qui exécute la vérification même sur les valeurs vides.
Pages associées
Validation (introduction)
Consultez la méthode standard de validation dans les contrôleurs et les form requests.