Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /home/hufersil/hufersil.com.br/system/libraries/lumine/lib/Connection/MySQL.php on line 516
HUFERSIL WEBDEVELOPER - Validações

HUFERSIL.WEBDEVELOPER - Soluções com qualidade - Hugo Ferreira da Silva

Validações Ter, 22 de janeiro de 2008 - as 22h54

Antes de inserir ou atualizar registros no banco de dados, é sempre interessante realizar uma validação do mesmo para sabermos se as informações enviadas pelo usuário condizem com o esperado para armazenamento. Lumine oferece uma forma bem elegante de se fazer isso.

As validações de sua entidade são descritas em um arquivo XML separado, chamado de lumine-validator, onde você poderá declarar as regras de validação para cada campo de sua entidade (lembrando que na hora de referenciar os campos nas regras de validação, Lumine irá utilizar o atributo name dos campos, e não o nome da coluna [ column ]).

O nome deste arquivo deve ser o nome de sua classe com o sufixo -validation.xml, ou seja, se sua classe chama-se Pessoa, o nome do arquivo deverá ser Pessoa-validation.xml.

Lumine irá procurar por este arquivo, por padrão, nos seguintes locais:

  • Na pasta raiz de sua aplicação (class_path);
  • Procurará por uma pasta chamada validators dentro do caminho declarado em package. Ou seja, se a pasta usada como pacote é /www/aplicacao/entidades, Lumine também irá procurar em /www/aplicacao/entidades/validators.

Em todo caso, você também poderá informar um outro local em seu arquivo de configuração, indicando através do índice xml_validation_path.

  1. <lumine-validator>
  2.        
  3.         <!-- validando o campo nome do cliente -->
  4.         <field name="nome">
  5.                 <validator type="requiredString" minlength="3" maxlength="150" msg="Informe o nome cliente, entre 3 e 150 caracteres "></validator>
  6.         </field>
  7.  
  8.         <!-- validando o usuário -->
  9.         <field name="usuario">
  10.                 <validator type="requiredString" minlength="4" msg="Informe um usuário com ao menos 4 letras"></validator>
  11.         </field>
  12.  
  13.         <!-- validando a senha do usuário -->
  14.         <field name="senha">
  15.                 <validator type="requiredString" minlength="5" msg="Informe sua senha com ao menos 5 caracteres"></validator>
  16.                 <validator type="rule" rule="'#usuario#' != '#senha#'" msg="Sua senha não pode conter o nome de seu usuário"></validator>
  17.         </field>
  18.        
  19.         <!-- validando o email do cliente -->
  20.         <field name="email">
  21.                 <validator type="requiredString" msg="Informe um e-mail para o cliente"></validator>
  22.                 <validator type="requiredEmail" msg="Formato de e-mail inválido"></validator>
  23.                 <validator type="unique" msg="Já existe um cliente com este e-mail"></validator>
  24.         </field>
  25.        
  26.         <!-- validando o CPF do cliente -->
  27.         <field name="cpf">
  28.                 <validator type="requiredString" msg="Informe o CPF do cliente"></validator>
  29.                 <validator type="requiredNumber" msg="O CPF deve conter somente números"></validator>
  30.                 <validator type="requiredString" minlength="11" maxlength="11" msg="O CPF deve ter 11 digitos"></validator>
  31.                 <validator type="unique" msg="Já existe um cliente com este CPF"></validator>
  32.         </field>
  33.        
  34.         <!-- exemplo de validação com classe externa -->
  35.         <field name="data_expiracao">
  36.                 <validator type="class" classname="CustomValidatorClass" method="checaDataExpiracao" msg="Data de expiração inválida"></validator>
  37.         </field>
  38.  
  39.         <!-- validando de regra personalizada (> representa o sinal de maior) -->
  40.         <field name="ordem">
  41.                 <validator type="requiredNumber" msg="O valor da ordem deve ser numérico"></validator>
  42.                 <validator type="rule" rule="#ordem# > 0" msg="A ordem deve ser maior que zero"></validator>
  43.                 <validator type="requiredNumber" minvalue="1" maxvalue="10" msg="O valor deve estar entre 1 e 10"></validator>
  44.         </field>
  45. </lumine-validator>

Como podemos perceber, existem vários tipos de validators disponíveis, fazendo com que você tenha uma maleabilidade muito grande para validar suas classes, vamos analisar cada tipo de validator separadamente:

  • requiredString
    Possibilita a validação se o usuário digitou uma string ou a deixou vazia. Ainda possui os atributos minlength e maxlength, que permitem controlar o número mínimo e máximo de caracteres. Em todos os casos, o atributo msg indica a mensagem de erro que irá ser retornada em caso de erro. 

  • requiredNumber
    Possibilita a validação de números, para saber se realmente o que o usuário está digitando é número, para poderem serem inseridos com segurança no banco de dados. Há também os atributos minvalue e maxvalue, que checam se o valor digitado é maior ou igual a minvalue ou se é menor ou igual a maxvalue. Você pode usar um ou outro, ou os dois em conjunto, como mostrado no exemplo acima.

  • requiredEmail
    Verifica se o valor informado é um endereço de e-mail. 

  • rule
    Com este tipo de validator, você poderá fazer comparações mais pessoais, inclusive comparação entre campos diferentes da mesma entidade. No exemplo acima, note que fiz a comparação entre os campos senha e usuario. Para que Lumine reconheça que o valor a ser comparado é um campo da entidade, você deve colocar o nome da propridade entre o símbolo #, por exemplo: #usuario# e #senha#. Dessa forma, Lumine irá procurar dentro da entidade Pessoa os atributos usuario e senha. Importante: se a validação a ser feita é entre campos que contém valores alfa-numéricos, você deve coloca-los entre aspas simples ( ' ), como no exemplo mostrado. Para utilizar comparações com o sinal de maior ( > ) ou menor ( < ), você deve utilizar as entidades relacionadas aos seus símbolos:

    • > para o símbolo de >;
    • < para o símbolob de <;
    • & para o símbolo de &;
    • " para a aspa dupla ( " );
       
  • class
    Este último, permite que você utilize uma classe própria para validar o campo desejado. Lumine irá procurar dentro da class-path informada no arquivo de configuração pela classe informada no atributo classname. Você deve informá-la como meupacote.MinhaClasse. Lumine irá procurar pelo arquivo nos seguintes locais por padrão:

    • Na raiz de sua class_path;
    • Na mesma pasta de suas entidades (classes em PHP);
    • Na pasta de validators padrão do Lumine (LUMINE_INCLUDE_PATH / lib / Validator / Custom / NomeDaClasse.php );
    • Na opção php_validator_path definida em seu arquivo de configuração (se definida);
  • O nome da classe deve ser o mesmo nome do arquivo (claro, exceto a extensão .php). Então, Lumine irá criar uma instância dessa classe, verificar se o método informado no parâmetro method existe, passar o valor contido na classe que está sendo verificada como parâmetro no método indicado em method, executar o método e recuperar o seu retorno. Este retorno deve ser do tipo Boolean (true or false). A mensagem de erro que Lumine irá recuperar deverá ser informada no arquivo de validação no atributo msg.
  • unique
    Com ele, você poderá por exemplo, verificar se já existe um usuário com o email desejado. Lumine tentará encontrar registros previamente cadastrados com o valor informado. Caso ele ache, irá comparar as chaves primárias do valor que será inserido ou atualizado. Caso as chaves não coincidam, significa que o valor desejado já está sendo usado, do contrário poderá ser inserido sem problemas.

Para aumentar a performance na validação, copie o arquivo validator.dtd para o mesmo diretório onde estão os arquivos XML de validação, e faça a alteração abaixo:

  1. <!-- altere a linha -->
  2.  
  3. <!-- para -->

Depois de validada, as mensagens de erro estarão disponíveis na matriz associativa e superglobal $_REQUEST, com o nome do campo com o sufixo _error. Exemplo: caso ocorra algum erro com os dados informados no campo usuario, você poderá recuperar a mensagem de erro em $_REQUEST['usuario_error']. Ou ainda, você poderá recuperar o retorno do método, exemplo:

  1. $erros = $cliente->validate();
  2. if( $erros === true )
  3. {
  4.         // ok pode gravar
  5.         $cliente->save();
  6.  
  7. // ops houveram erros
  8. } else {
  9.         echo "Houveram os seguintes erros:
  10. ";
  11.         foreach($erros as $key => $value)
  12.         {
  13.                 echo $key . ": " . $value . "
  14. ";
  15.         }
  16. }


Você poderá utilizar também métodos dentro de suas classes para validar campos. Basta você criar métodos na classe que comecem com validate mais o nome do campo com a primeira letra em maiúscula, exemplo, validateUsuario. Exemplo:

  1. class Pessoa extends Lumine_Base {
  2.         .....
  3.         public function validateUsuario()
  4.         {
  5.                 if( $this->usuario == '' )
  6.                 {
  7.                         return false;
  8.                 } else {
  9.                         return true;
  10.                 }
  11.         }
  12. }

Nota de atualização

A partir da versão 1.5, as validações sempre retornam um array.

Então, para saber se houve erros:

  1. $erros = $obj->validate();
  2. if( count($erros) == 0 ){
  3.    // ok, nao houve erros, pode continuar
  4. } else {
  5.    // houve erros, corrige aeh!
  6. }