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.
<lumine-validator>
<!-- validando o campo nome do cliente -->
<field name="nome">
<validator type="requiredString" minlength="3" maxlength="150" msg="Informe o nome cliente, entre 3 e 150 caracteres "></validator>
</field>
<!-- validando o usuário -->
<field name="usuario">
<validator type="requiredString" minlength="4" msg="Informe um usuário com ao menos 4 letras"></validator>
</field>
<!-- validando a senha do usuário -->
<field name="senha">
<validator type="requiredString" minlength="5" msg="Informe sua senha com ao menos 5 caracteres"></validator>
<validator type="rule" rule="'#usuario#' != '#senha#'" msg="Sua senha não pode conter o nome de seu usuário"></validator>
</field>
<!-- validando o email do cliente -->
<field name="email">
<validator type="requiredString" msg="Informe um e-mail para o cliente"></validator>
<validator type="requiredEmail" msg="Formato de e-mail inválido"></validator>
<validator type="unique" msg="Já existe um cliente com este e-mail"></validator>
</field>
<!-- validando o CPF do cliente -->
<field name="cpf">
<validator type="requiredString" msg="Informe o CPF do cliente"></validator>
<validator type="requiredNumber" msg="O CPF deve conter somente números"></validator>
<validator type="requiredString" minlength="11" maxlength="11" msg="O CPF deve ter 11 digitos"></validator>
<validator type="unique" msg="Já existe um cliente com este CPF"></validator>
</field>
<!-- exemplo de validação com classe externa -->
<field name="data_expiracao">
<validator type="class" classname="CustomValidatorClass" method="checaDataExpiracao" msg="Data de expiração inválida"></validator>
</field>
<!-- validando de regra personalizada (> representa o sinal de maior) -->
<field name="ordem">
<validator type="requiredNumber" msg="O valor da ordem deve ser numérico"></validator>
<validator type="rule" rule="#ordem# > 0" msg="A ordem deve ser maior que zero"></validator>
<validator type="requiredNumber" minvalue="1" maxvalue="10" msg="O valor deve estar entre 1 e 10"></validator>
</field>
</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:
<!-- altere a linha -->
<!-- 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:
$erros = $cliente->validate();
if( $erros === true )
{
// ok pode gravar
$cliente->save();
// ops houveram erros
} else {
echo "Houveram os seguintes erros:
";
foreach($erros as $key => $value)
{
echo $key . ": " . $value . "
";
}
}
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:
class Pessoa extends Lumine_Base {
.....
public function validateUsuario()
{
if( $this->usuario == '' )
{
return false;
} else {
return true;
}
}
}
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:
$erros = $obj->validate();
if( count($erros) == 0 ){
// ok, nao houve erros, pode continuar
} else {
// houve erros, corrige aeh!
}