Récapitulatif - Validateur de formulaire
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 69 sur 91.
Défi
FacileConstruisons un validateur de formulaire d'inscription d'utilisateur qui collecte les erreurs de validation et les signale toutes en même temps, plutôt que de s'arrêter au premier problème. C'est ainsi que fonctionne la validation de formulaire dans le monde réel — les utilisateurs veulent voir tous les problèmes liés à leur soumission, et non les corriger un par un.
Vous organiserez votre code sur quatre fichiers :
ValidationException.php— Créez une classe de baseValidationExceptionqui étendException. Elle servira de parent pour toutes les exceptions liées à la validation.Exceptions.php— Incluez le fichier ValidationException et créez trois classes d'exception spécifiques qui étendentValidationException:RequiredFieldException— Accepte un nom de champ dans son constructeur et transmet le message"[fieldName] is required"au parentInvalidEmailException— Accepte une chaîne d'email dans son constructeur et transmet le message"'[email]' is not a valid email"au parentMinLengthException— Accepte un nom de champ et une longueur minimale (int) dans son constructeur et transmet le message"[fieldName] must be at least [minLength] characters"au parent
FormValidator.php— Incluez le fichier Exceptions et créez une classeFormValidatoravec ces méthodes de validation :validateRequired(?string $value, string $fieldName): string— Lance uneRequiredFieldExceptionsi la valeur est nulle ou vide (après suppression des espaces), sinon retourne la valeur nettoyéevalidateEmail(string $email): string— Lance uneInvalidEmailExceptionsi l'email est invalide (utilisezfilter_varavecFILTER_VALIDATE_EMAIL), sinon retourne l'emailvalidateMinLength(string $value, string $fieldName, int $minLength): string— Lance uneMinLengthExceptionsi la longueur de la chaîne est inférieure au minimum, sinon retourne la valeur
main.php— Incluez le fichier FormValidator. Vous recevrez trois entrées : un nom d'utilisateur, un email et un mot de passe.Créez un
FormValidatoret un tableau vide pour collecter les messages d'erreur. Validez chaque champ dans un bloc try-catch séparé :- Validez que le nom d'utilisateur est requis
- Validez d'abord que l'email est requis, puis validez qu'il a un format d'email valide
- Validez d'abord que le mot de passe est requis, puis validez qu'il a une longueur minimale de 8 caractères
Lors de la capture d'une
ValidationException, ajoutez son message à votre tableau d'erreurs au lieu d'arrêter l'exécution.Après toutes les validations, s'il y a des erreurs, affichez chaque message d'erreur sur sa propre ligne. S'il n'y a pas d'erreurs, affichez
"Registration successful".
Ce modèle de collecte de toutes les erreurs avant de les signaler est essentiel pour une bonne expérience utilisateur. Votre hiérarchie d'exceptions permet de capturer facilement tous les problèmes de validation avec un seul bloc catch tout en ayant des types d'exceptions spécifiques pour les différents échecs de validation.
Essayez vous-même
<?php
require_once 'FormValidator.php';
// Lire les entrées
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
// Créer une instance de FormValidator
$validator = new FormValidator();
// Créer un tableau vide pour collecter les messages d'erreur
$errors = [];
// TODO: Valider que le nom d'utilisateur est requis dans un bloc try-catch
// Attraper ValidationException et ajouter son message au tableau $errors
// TODO: Valider l'e-mail comme requis d'abord, puis valider qu'il s'agit d'un format d'e-mail valide
// Utiliser un bloc try-catch et ajouter tous les messages d'erreur au tableau $errors
// TODO: Valider le mot de passe comme requis d'abord, puis valider une longueur minimale de 8 caractères
// Utiliser un bloc try-catch et ajouter tous les messages d'erreur au tableau $errors
// TODO: Après toutes les validations :
// - S'il y a des erreurs, afficher chaque message d'erreur sur sa propre ligne
// - S'il n'y a pas d'erreurs, afficher "Registration successful"
?>Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée11Système de types et gestion des erreurs
Déclarations de typesTypes nullablesTypes d'union et d'intersectionClasses d'exceptionHiérarchie d'exceptions personnaliséesTry, Catch, FinallyRécapitulatif - Validateur de formulaire3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie