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.
Desafio
FácilVamos 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 baseValidationExceptionque estendeException. 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 estendemValidationException:RequiredFieldException— Aceita um nome de campo em seu construtor e passa a mensagem"[fieldName] is required"para o paiInvalidEmailException— Aceita uma string de e-mail em seu construtor e passa a mensagem"'[email]' is not a valid email"para o paiMinLengthException— 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 classeFormValidatorcom estes métodos de validação:validateRequired(?string $value, string $fieldName): string— LançaRequiredFieldExceptionse o valor for nulo ou vazio (após o trim), caso contrário, retorna o valor com trimvalidateEmail(string $email): string— LançaInvalidEmailExceptionse o e-mail for inválido (usefilter_varcomFILTER_VALIDATE_EMAIL), caso contrário, retorna o e-mailvalidateMinLength(string $value, string $fieldName, int $minLength): string— LançaMinLengthExceptionse 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
FormValidatore 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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy