Riepilogo - Validatore di moduli
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 69 di 91.
Sfida
FacileCreiamo un validatore per un modulo di registrazione degli utenti che raccolga gli errori di validazione e li segnali tutti insieme, invece di fermarsi al primo problema. È così che funziona la validazione dei moduli nel mondo reale: gli utenti vogliono vedere tutti i problemi relativi ai dati inviati, non correggerli uno alla volta.
Organizzerai il codice in quattro file:
ValidationException.php: crea una classe baseValidationExceptionche estendeException. Questa funge da classe genitore per tutte le eccezioni relative alla validazione.Exceptions.php: includi il file ValidationException e crea tre classi di eccezione specifiche che estendonoValidationException:RequiredFieldException: accetta il nome di un campo nel costruttore e passa alla classe genitore il messaggio"[fieldName] is required"InvalidEmailException: accetta una stringa email nel costruttore e passa alla classe genitore il messaggio"'[email]' is not a valid email"MinLengthException: accetta nel costruttore il nome di un campo e una lunghezza minima (int) e passa alla classe genitore il messaggio"[fieldName] must be at least [minLength] characters"
FormValidator.php: includi il file Exceptions e crea una classeFormValidatorcon questi metodi di validazione:validateRequired(?string $value, string $fieldName): string: generaRequiredFieldExceptionse il valore è null o vuoto (dopo averlo ripulito dagli spazi iniziali e finali); altrimenti restituisce il valore ripulitovalidateEmail(string $email): string: generaInvalidEmailExceptionse l'email non è valida (usafilter_varconFILTER_VALIDATE_EMAIL); altrimenti restituisce l'emailvalidateMinLength(string $value, string $fieldName, int $minLength): string: generaMinLengthExceptionse la lunghezza della stringa è inferiore al minimo; altrimenti restituisce il valore
main.php: includi il file FormValidator. Riceverai tre input: un nome utente, un'email e una password.Crea un
FormValidatore un array vuoto per raccogliere i messaggi di errore. Convalida ogni campo in un blocco try-catch separato:- Convalida che il nome utente sia obbligatorio
- Convalida prima che l'email sia obbligatoria, poi che abbia un formato email valido
- Convalida prima che la password sia obbligatoria, poi che abbia una lunghezza minima di 8 caratteri
Quando intercetti una
ValidationException, aggiungi il suo messaggio all'array degli errori invece di interrompere l'esecuzione.Dopo tutte le convalide, se ci sono errori, stampa ogni messaggio di errore su una riga separata. Se non ci sono errori, stampa
"Registration successful".
Questo schema, che consiste nel raccogliere tutti gli errori prima di segnalarli, è essenziale per offrire una buona esperienza utente. La gerarchia delle eccezioni semplifica l'intercettazione di tutti i problemi di validazione con un singolo blocco catch, mantenendo al contempo tipi di eccezione specifici per i diversi errori di validazione.
Provalo tu
<?php
require_once 'FormValidator.php';
// Leggi gli input
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
// Crea un'istanza di FormValidator
$validator = new FormValidator();
// Crea un array vuoto per raccogliere i messaggi di errore
$errors = [];
// TODO: Verifica che username sia presente in un blocco try-catch
// Intercetta ValidationException e aggiungi il suo messaggio all'array $errors
// TODO: Verifica prima che email sia presente, poi che abbia un formato email valido
// Usa un blocco try-catch e aggiungi eventuali messaggi di errore all'array $errors
// TODO: Verifica prima che password sia presente, poi che abbia una lunghezza minima di 8 caratteri
// Usa un blocco try-catch e aggiungi eventuali messaggi di errore all'array $errors
// TODO: Dopo tutte le verifiche:
// - Se ci sono errori, stampa ogni messaggio di errore su una riga separata
// - Se non ci sono errori, stampa "Registration successful"
?>Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online