Sempre que estava envolvido em algum projeto php eu sentia que faltava algo que fosse realmente eficiente para fazer qualquer tipo de validação de dados. Algo que estivesse efetivamente testado e aprovado e que me permitisse a reutilização de código e principalmente, que fosse adaptável a qualquer tipo de sistema.
Foi pensando nisso que tirei as horas vagas desse último mês de dezembro para implementar uma classe de validação de dados (que apelidei de DataValidator). E para ajudar a comunidade desenvolvedora de todo mundo estou disponibilizando ela no GitHub(https://github.com/rafaelwendel/DataValidator).
Nesse post vou mostrar para vocês como é fácil incorporar e utilizar a classe DataValidator no seu projeto e como fazer as validações.Bom, primeira coisa a se fazer é o download da classe. Você pode fazê-lo pelo link do github que eu passei acima ou então clonando a classe pelo seu git bash.
$ git clone https://github.com/rafaelwendel/DataValidator.git |
Validando Dados com o DataValidator
Agora vamos instanciar a classe e fazer a primeira validação. Imagine que em um cadastro, o atributo nome não pode ser vazio e ele requer ao mínimo 3 caracteres para poder ser salvo
1 2 3 4 5 6 7 8 | ini_set('default_charset','UTF-8'); include 'DataValidator.php'; $validate = new Data_Validator(); $validate->set('nome1', 'Rafael')->is_required()->min_length(3); //Será validado $validate->set('nome2', '')->is_required()->min_length(3); //Não será validado $validate->set('nome3', 'Ra')->is_required()->min_length(3); //Não será validado |
Note que apenas nomes com mais de 3 caracteres são validados!
É comum que tenhamos que validar vários campos de uma vez. E é por isso que no DataValidator os métodos validadores sempre retornam a própria instância, assim podemos encadear as validações e economizar linhas de código.
1 2 3 4 5 6 7 8 | ini_set('default_charset','UTF-8'); include 'DataValidator.php'; $validate = new Data_Validator(); $validate->('nome', 'Rafael')->is_required()>min_length(3) ->set('email', 'rafaelwendel@hotmail.com')->is_email() ->set('idade', 26)->min_value(18); |
Para efetuar a validação de todos os dados que passamos para análise basta executar o método booleano validate().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ini_set('default_charset','UTF-8'); include 'DataValidator.php'; $validate = new Data_Validator(); $validate->set('nome', 'Rafael')->is_required()->min_length(3) ->set('email', 'rafaelwendel@hotmail.com')->is_email() ->set('idade', 26)->min_value(18); if($validate->validate()){ //Todos os campos foram validados } else{ //Algum dado não foi validado } |
Capturando, personalizando e exibindo os erros de validação
Para capturar os erros de validações, o método get_errors() nos retorna um array com todos os erros que aconteceram durante a validação. Se quiser capturar um erro específico basta passar o nome do campo como parâmetro.
1 2 3 4 5 6 7 8 9 10 | ini_set('default_charset','UTF-8'); include 'DataValidator.php'; $validate = new Data_Validator(); $validate->set('nome', 'Ra')->min_length(3); $validate->set('email', 'something')->is_email(); $erros = $validate->get_errors(); //Retorna um array com todos os erros $erro_nome = $validate->get_errors('nome'); // Retorna apenas os erros que ocorreram na validação do campo nome |
O método get_errors() retorna um array cujo índice é o próprio nome do campo e seus valores são cada erro referente àquele campo. Porém, temos a opção de alterar os nomes dos índices para algo mais sugestivo e que vá ajudar lá na frente na hora de mostrar esses erros para o usuário. Para isso podemos definir um prefixo e um sufixo para o nome do índice do array com o método define_pattern($prefix, $sufix).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ini_set('default_charset','UTF-8'); include 'DataValidator.php'; $validate = new Data_Validator(); /*Defino um prefixo para o índice de erros Assim o array de erros para o campo nome será assim: $erros['erro_nome'] = 'O campo nome é obrigatório' */ $validate->define_pattern('erro_', ''); $validate->set('nome', 'Ra')->min_length(3); $validate->set('email', 'something')->is_email(); $erros = $validate->get_errors(); //Retorna um array com todos os erros echo $erros['erro_nome'][0] . '<br />'; // Exibe: O campo nome deve conter ao mínimo 3 caracter(es) echo $erros['erro_email'][0]; // Exibe: O email something não é válido |
Lembrando que é possível usar prefixo e sufixo ou apenas um deles.
Veja agora um exemplo completo de validação.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ini_set('default_charset','UTF-8'); include 'DataValidator.php'; $validate = new Data_Validator(); /* Defino um prefixo para o índice do array de erros */ $validate->define_pattern('erro_'); $validate->set('nome', 'Rafael')->is_required()->min_length(3) ->set('email', 'rafaelwendel@hotmail.com')->is_email() ->set('idade', 26)->min_value(18) ->set('url', 'http://www.rafaelwendel.com')->is_url(); if($validate->validate()){ echo 'Todos os dados foram validados com sucesso'; } else{ $erros = $validate->get_errors(); foreach ($erros as $erro){ //Percorre todos os erros foreach ($erro as $err){ //Percorre cada erro do campo especifico echo '<p>' . $err . '</p>'; } } } |
Nesse exemplo todos os campos serão validados. Faça simulações com dados que não passam pelas validações.
E é isso. Em posts futuros mostrarei mais funcionalidades dessa classe.
Estou aberto a críticas e sugestões para quem quiser contribuir com esse projeto.
A seguir uma lista de todos os métodos validadores disponíveis na classe (até agora).
- is_required
- min_length
- max_length
- between_length
- min_value
- max_value
- between_values
- is_email
- is_url
- is_slug
- is_num
- is_integer
- is_float
- is_string
- is_boolean
- is_obj
- is_arr
- is_equals
- is_not_equals
- is_cpf
- is_cnpj
- contains
- not_contains
- is_lowercase
- is_uppercase
- is_multiple
- is_positive
- is_negative
- is_date
- is_alpha
- is_alpha_num
- no_whitespaces
Abs!!!
Olá Rafael, tudo bem?
Essa classe realmente ficou bem flexível, facilmente adapta a qualquer projeto, e seu uso é bem simples!
Fiz aqui um teste e encontre uma falha, as chaves ‘prefix’ e ‘sufix’ do array $_pattern precisam ser iniciadas. Diretamente na propriedade ou no construtor.
protected $_pattern = array(‘prefix’ => ”, ‘sufix’ => ”)
ou
__construct() { $this->define_pattern() }
Valeu por compartilhar com a comunidade.
Abs
Olá Trambulhao,
Realmente pode acontecer de dar erro de acordo com o display de erros.
Fiz a alteração no arquivo assim como sugerido e já commitei para o repositório.
Obrigado pela contribuição.
Abs!
Caramba, parece MUITO útil essa sua class, estou com um projeto aqui que em varias páginas ira validar CPF e CNPJ, vou utilizar essa sua “biblioteca” (posso chamar assim né? já que possui varias funções de validação…) para economizar tempo.
Só que irei adaptar a biblioteca para validação também em AJAX usando a biblioteca jQuery, minha necessidade exige uma pré-validação lado-cliente pois o formulário e um pouco extenso.
Depois se quiser os codigos para validação ajax (jQuery) usando os mesmos algoritmos da sua biblioteca não tem problema, só me envie um email confirmando o interesse, que terminando aqui te respondo com os arquivos.
Parabéns, não é qualquer programador que leva horas desenvolvendo funções e classes, e disponibiliza na net.
Olá Chinnon Santos,
Que bom que a classe será util no seu projeto. E pra você que deseja fazer a validação lado cliente também, segue um artigo que escrevi a respeito do Jquery Validate
http://www.rafaelwendel.com/2012/04/validando-formularios-com-jquery/
Espero que também te ajude
Abs
Ok, mas estou usando o mesmo aquivo PHP pra validação javascript e PHP para não da diferença nos algoritmos… mas mudando de assunto, a função ‘is_cnpj’ esta com problemas, não esta validando CNPJ validos… peguei alguns CNPJ reais e não passa, com ou sem pontuação, também gerei varios CNPJ por um site que gera para teste e nada… da um check-in ai… valew…
O erro esta na linha 497, tinha um erro na variável, por isso ele não estava validando nada… corrigi o original pro pessoal não ter problemas…
é só alterar de:
$c = preg_replace(‘/\D/’, ”, $input);
Para:
$c = preg_replace(‘/\D/’, ”, $this->_data[‘value’]);
Ai funciona.. Falow Rafael…
Olá Chinnon,
Fiz a correção no arquivo e commitei para o repositório.
Obrigado pela força mais uma vez.
Abraço!
Gostei da sua classe, mas justamente a parte que mais me seria útil, não está funcionando.
Que é a validação de CNPJ, qualquer coisa que eu ponho retorna true.
Fora os erros de variáveis, mas isso é contornável.
Cara, Sensacional !! Meus parabéns pela sua bela iniciativa!
Olá.
Muito obrigado por compartilhar isso, gostei muito da classe. Agora fiquei em dúvida: como posso substituir o nome setado por um personalizado? Exemplo set(‘nome_completo’,’Fulano’), ao jogar o erro na tela quero trocar ‘nome_completo’ por ‘Nome completo’.
Agradeço desde já a ajuda, grande abraço!
Olá Acacio,
Na hora de setar um campo para ser validado já o chame de “Nome Completo”.
Abs!
Ow, valeu obrigado 🙂
Estou com um pequeno problema. Quando vou validar, por exemplo, URL eu coloco a validação “is_url”, só que se eu não colocar “required” e deixar o campo em branco, ele valida como “URL não válida”.
Será que posso resolver isso com essa classe?
Obrigado pela atenção.
Bom,
Se você não coloca nada (deixa o campo em branco) ele não consegue validar a URL (pois obviamente ela é inválida, pois está em branco). Logo não passa na verificação.
Bom, é isso.
Não entendi exatamente como você gostaria que acontecesse. Se tiver preenchido o campo “URL” ele valida e se não tiver é pra aceitar mesmo em branco?
Abs!
E pra validação de comparação de campos? Ex.:
Campo “senha” -> campo “repete_senha”
Verificar se os dois são exatamente iguais.
Olá Fábio,
Utilize o método is_equals
Todas validações são protegidos com anti-injection? ou somente contra inputs errados?
Trabalho bonito Rafael Pinheiro, valeu cara! O seu trabalho vai poupar-me muito esforço, obrigado cara!
Opa vim parar aqiu hoje e mao na roda obrigado