DataValidator – Classe php para validar dados

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!!!

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. 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

  2. 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.

  3. 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…

  4. 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…

  5. 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.

  6. 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!

      1. 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.

        1. 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!

  7. E pra validação de comparação de campos? Ex.:
    Campo “senha” -> campo “repete_senha”

    Verificar se os dois são exatamente iguais.

    1. Olá Fábio,

      Utilize o método is_equals

      1
      2
      
      $validate->set('senha', $senha)->is_equals($confirma_senha, true); 
      //true é case sensitive e false não é case sensitive.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *