Menu
Coddy logo textTech

Recapitulação - Validador de Formulário

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 69 de 91.

challenge icon

Desafio

Fácil

Vamos construir um validador de formulário de registro de usuário que coleta erros de validação e os reporta todos de uma vez, em vez de parar no primeiro problema. É assim que a validação de formulários funciona no mundo real — os usuários querem ver todos os problemas com seu envio, não corrigi-los um por um.

Você organizará seu código em quatro arquivos:

  • ValidationException.php — Crie uma classe base ValidationException que estende Exception. Esta servirá como a classe pai para todas as exceções relacionadas à validação.
  • Exceptions.php — Inclua o arquivo ValidationException e crie três classes de exceção específicas que estendem ValidationException:
    • RequiredFieldException — Aceita um nome de campo em seu construtor e passa a mensagem "[fieldName] is required" para o pai
    • InvalidEmailException — Aceita uma string de e-mail em seu construtor e passa a mensagem "'[email]' is not a valid email" para o pai
    • MinLengthException — Aceita um nome de campo e um comprimento mínimo (int) em seu construtor e passa a mensagem "[fieldName] must be at least [minLength] characters" para o pai
  • FormValidator.php — Inclua o arquivo Exceptions e crie uma classe FormValidator com estes métodos de validação:
    • validateRequired(?string $value, string $fieldName): string — Lança RequiredFieldException se o valor for nulo ou vazio (após o trim), caso contrário, retorna o valor com trim
    • validateEmail(string $email): string — Lança InvalidEmailException se o e-mail for inválido (use filter_var com FILTER_VALIDATE_EMAIL), caso contrário, retorna o e-mail
    • validateMinLength(string $value, string $fieldName, int $minLength): string — Lança MinLengthException se o comprimento da string for menor que o mínimo, caso contrário, retorna o valor
  • main.php — Inclua o arquivo FormValidator. Você receberá três entradas: um nome de usuário, um e-mail e uma senha.

    Crie um FormValidator e um array vazio para coletar mensagens de erro. Valide cada campo em um bloco try-catch separado:

    • Valide o username como obrigatório
    • Valide o email como obrigatório primeiro, depois valide-o como um formato de e-mail válido
    • Valide a password como obrigatória primeiro, depois valide se ela tem um comprimento mínimo de 8 caracteres

    Ao capturar uma ValidationException, adicione sua mensagem ao seu array de erros em vez de interromper a execução.

    Após todas as validações, se houver erros, imprima cada mensagem de erro em sua própria linha. Se não houver erros, imprima "Registration successful".

Este padrão de coletar todos os erros antes de reportá-los é essencial para uma boa experiência do usuário. Sua hierarquia de exceções facilita a captura de todos os problemas de validação com um único bloco catch, mantendo tipos de exceção específicos para diferentes falhas de validação.

Experimente você mesmo

<?php
require_once 'FormValidator.php';

// Ler entradas
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$password = trim(fgets(STDIN));

// Criar uma instância do FormValidator
$validator = new FormValidator();

// Criar um array vazio para coletar mensagens de erro
$errors = [];

// TODO: Validar username como obrigatório em um bloco try-catch
// Capturar ValidationException e adicionar sua mensagem ao array $errors

// TODO: Validar email como obrigatório primeiro, depois validá-lo como um formato de email válido
// Usar um bloco try-catch e adicionar quaisquer mensagens de erro ao array $errors

// TODO: Validar password como obrigatório primeiro, depois validar o comprimento mínimo de 8 caracteres
// Usar um bloco try-catch e adicionar quaisquer mensagens de erro ao array $errors

// TODO: Após todas as validações:
// - Se houver erros, imprimir cada mensagem de erro em sua própria linha
// - Se não houver erros, imprimir "Registration successful"

?>

Todas as lições de Programação Orientada a Objetos