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 criar um validador de formulário de cadastro de usuário que coleta os erros de validação e os relata 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 do envio, não corrigi-los um de cada vez.
Você organizará seu código em quatro arquivos:
ValidationException.php: crie uma classe baseValidationExceptionque estendeException. Ela serve como 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 a classe paiInvalidEmailException: aceita uma string de e-mail em seu construtor e passa a mensagem"'[email]' is not a valid email"para a classe 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 a classe 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 remover os espaços em branco); caso contrário, retorna o valor sem os espaços em brancovalidateEmail(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 as mensagens de erro. Valide cada campo em um bloco try-catch separado:- Valide o nome de usuário como obrigatório
- Valide primeiro o e-mail como obrigatório e, em seguida, valide-o quanto ao formato de e-mail válido
- Valide primeiro a senha como obrigatória e, em seguida, valide se ela tem um comprimento mínimo de 8 caracteres
Ao capturar uma
ValidationException, adicione a mensagem dela 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".
Esse padrão de coletar todos os erros antes de relatá-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 ainda 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 de 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 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
// - If there are no errors, print "Registration successful"
?>Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da 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 às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem 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 NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre 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 StrategyPratique por conta própria: Compilador de PHP online