Resumen - Validador de formularios
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 69 de 91.
Desafío
FácilVamos a construir un validador de formularios de registro de usuario que recopile errores de validación y los informe todos a la vez, en lugar de detenerse en el primer problema. Así es como funciona la validación de formularios en el mundo real: los usuarios quieren ver todos los problemas con su envío, no corregirlos uno por uno.
Organizarás tu código en cuatro archivos:
ValidationException.php— Crea una clase baseValidationExceptionque extienda deException. Esta servirá como la clase padre para todas las excepciones relacionadas con la validación.Exceptions.php— Incluye el archivo ValidationException y crea tres clases de excepción específicas que extiendan deValidationException:RequiredFieldException— Acepta un nombre de campo en su constructor y pasa el mensaje"[fieldName] is required"al padreInvalidEmailException— Acepta una cadena de correo electrónico en su constructor y pasa el mensaje"'[email]' is not a valid email"al padreMinLengthException— Acepta un nombre de campo y una longitud mínima (int) en su constructor y pasa el mensaje"[fieldName] must be at least [minLength] characters"al padre
FormValidator.php— Incluye el archivo Exceptions y crea una claseFormValidatorcon estos métodos de validación:validateRequired(?string $value, string $fieldName): string— LanzaRequiredFieldExceptionsi el valor es nulo o está vacío (después de usar trim), de lo contrario devuelve el valor con trim aplicadovalidateEmail(string $email): string— LanzaInvalidEmailExceptionsi el correo electrónico no es válido (usafilter_varconFILTER_VALIDATE_EMAIL), de lo contrario devuelve el correo electrónicovalidateMinLength(string $value, string $fieldName, int $minLength): string— LanzaMinLengthExceptionsi la longitud de la cadena es menor que el mínimo, de lo contrario devuelve el valor
main.php— Incluye el archivo FormValidator. Recibirás tres entradas: un nombre de usuario, un correo electrónico y una contraseña.Crea un
FormValidatory un array vacío para recopilar los mensajes de error. Valida cada campo en un bloque try-catch separado:- Valida que el nombre de usuario sea obligatorio (required)
- Valida que el correo electrónico sea obligatorio primero, luego valida que tenga un formato de correo electrónico válido
- Valida que la contraseña sea obligatoria primero, luego valida que tenga una longitud mínima de 8 caracteres
Al capturar una
ValidationException, añade su mensaje a tu array de errores en lugar de detener la ejecución.Después de todas las validaciones, si hay errores, imprime cada mensaje de error en su propia línea. Si no hay errores, imprime
"Registration successful".
Este patrón de recopilar todos los errores antes de informarlos es esencial para una buena experiencia de usuario. Tu jerarquía de excepciones facilita la captura de todos los problemas de validación con un solo bloque catch, manteniendo al mismo tiempo tipos de excepción específicos para diferentes fallos de validación.
Pruébalo tú mismo
<?php
require_once 'FormValidator.php';
// Leer entradas
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
// Crear una instancia de FormValidator
$validator = new FormValidator();
// Crear un array vacío para recopilar mensajes de error
$errors = [];
// TODO: Validar el nombre de usuario como obligatorio en un bloque try-catch
// Capturar ValidationException y añadir su mensaje al array $errors
// TODO: Validar el correo electrónico como obligatorio primero, luego validarlo como un formato de correo válido
// Usar un bloque try-catch y añadir cualquier mensaje de error al array $errors
// TODO: Validar la contraseña como obligatoria primero, luego validar una longitud mínima de 8 caracteres
// Usar un bloque try-catch y añadir cualquier mensaje de error al array $errors
// TODO: Después de todas las validaciones:
// - Si hay errores, imprimir cada mensaje de error en su propia línea
// - Si no hay errores, imprimir "Registration successful"
?>Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada11Sistema de tipos y manejo de errores
Declaraciones de tiposTipos anulablesTipos de unión e intersecciónClases de excepciónJerarquía de excepciones personalizadasTry, Catch, FinallyResumen - Validador de formularios3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy