Menu
Coddy logo textTech

Repaso: validador de formularios

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 69 de 91.

challenge icon

Desafío

Fácil

Construyamos un validador de formularios de registro de usuarios que recopile los errores de validación y los informe todos a la vez, en lugar de detenerse ante el primer problema. Así funciona la validación de formularios en situaciones reales: los usuarios quieren ver todos los problemas de su envío, no corregirlos uno por uno.

Organizarás tu código en cuatro archivos:

  • ValidationException.php: Crea una clase base ValidationException que extienda Exception. Esta servirá como 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 ValidationException:
    • RequiredFieldException: Acepta un nombre de campo en su constructor y pasa el mensaje "[fieldName] is required" a la clase padre
    • InvalidEmailException: Acepta una cadena de correo electrónico en su constructor y pasa el mensaje "'[email]' is not a valid email" a la clase padre
    • MinLengthException: 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" a la clase padre
  • FormValidator.php: Incluye el archivo Exceptions y crea una clase FormValidator con estos métodos de validación:
    • validateRequired(?string $value, string $fieldName): string: Lanza RequiredFieldException si el valor es nulo o está vacío (después de eliminar los espacios), de lo contrario devuelve el valor sin espacios
    • validateEmail(string $email): string: Lanza InvalidEmailException si el correo electrónico no es válido (usa filter_var con FILTER_VALIDATE_EMAIL), de lo contrario devuelve el correo electrónico
    • validateMinLength(string $value, string $fieldName, int $minLength): string: Lanza MinLengthException si la longitud de la cadena es menor que la mínima, 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 FormValidator y un array vacío para recopilar los mensajes de error. Valida cada campo en un bloque try-catch separado:

    • Valida el nombre de usuario como obligatorio
    • Valida primero el correo electrónico como obligatorio y después valídalo como un formato de correo electrónico válido
    • Valida primero la contraseña como obligatoria y después 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 ofrecer 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, a la vez que mantiene tipos de excepción específicos para los distintos 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 username como requerido en un bloque try-catch
// Capturar ValidationException y añadir su mensaje al array $errors

// TODO: Validar email como requerido primero, luego validarlo como un formato de email válido
// Usar un bloque try-catch y añadir cualquier mensaje de error al array $errors

// TODO: Validar password como requerido primero, luego validar la 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
// - If there are no errors, print "Registration successful"

?>

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online