Validação com Zend_Validate
Deixe um Comentário
Da mesma forma como os filtros podem ser usados fora do contexto dos formulários os validadores também podem esse artigo tem como objetivo demostrar as demais formas de uso dos validadores com dados provenientes de outros lugares.
O que são Validadores
No artigo anterior sobre Filtros descrevi a diferença básica entre os filtros e validadores como sendo referente a alteração realizada no dado inicial, ao contrário dos filtros que realizam alterações nesses dados os validadores somente verificam se esse dado está de acordo com os padrões necessários e retorna um valor booleano como resposta.
Uso Básico dos Validadores
O uso dos validadores é bastante parecido com o uso dos filtros, porém como o retorno do método isValid() é um valor booleano podemos usar esse método juntamente com uma clausula condicional para realizar operações diferentes caso o valor seja válido ou não, o exemplo a segui ilustra essa prática.
$string = "abcde";
$validador = new Zend_Validate_Alpha();
if ($validador->isValid($string)) {
echo "String contém apenas caracteres alphabeticos";
} else {
foreach ($validador->getMessages() as $messageId => $message) {
echo "Falha na Validação '$messageId': $message\n";
}
}
Nesse exemplo foi criada uma variável $string e atribuído o valor “abcde” à ela, da mesma forma foi criada uma instância da classe Zend_Vaidade_Alpha que é a classe responsável por verificar se o valor passado para seu construtor contem apenas caracteres alfanuméricos, o método isValid() dessa classe foi chamado sendo passado como parâmetro para ele a string anteriormente definida dentro de uma cláusula condicional.
Essa cláusula condicional irá avaliar o retorno do método e caso ele seja verdadeiro (o que é o caso no exemplo) imprimirá na tela a informação de que o valor passado contém apenas caracteres alfanuméricos. Se a string passada não contivesse apenas esse tipo de caracteres seria chamado o método getMessages() dessa classe que retorna um array de mensagens de erro na validação e essas mensagens seriam impressas na tela através de um foreach().
O Zend Framework possui ainda muitos outros validadores ativamente implementados, para uma lista completa desses validadores você pode consultar a documentação oficial dos validadores.
Validadores em Cascata
Da mesma forma como as vezes é preciso realizar filtros sequências em um determinado valor as vezes também é necessário realizar validações sequências, para isso basta proceder da seguinte forma:
$string = "abcde123";
$validador= new Zend_Validate();
$validador->addValidator(new Zend_Validate_StringLength(array('min' => 6,'max' => 12)))
->addValidator(new Zend_Validate_Alnum());
if ($validador->isValid($string)) {
echo "String contém entre 6 e 12 caracteres alphanumericos";
} else {
foreach ($validador->getMessages() as $messageId => $message) {
echo "Falha na Validação '$messageId': $message\n";
}
}
No exemplo acima está sendo criada uma instância da classe Zend_Validate e os validadores estão sendo adicionados pelo método addValidator(), nesse caso o primeiro validador verifica se o valor passado tem no mínimo 6 e no máximo 12 caracteres e o segundo verifica se são todos alfanuméricos, o processo a seguir é o mesmo utilizado pelo exemplo com validadores individuais.
Criando Validadores Personalizados
O Zend Framework possui diversos validadores implementados nativamente, mas assim como no caso dos filtros pode ser que você precise implementar um validador personalizado, utilizando o mesmo exemplo do CEP novamente, porém para implementar um validador ao invés de um filtro isso seria feito da seguinte forma:
class Validate_Cep extends Zend_Validate_Abstract
{
const CEP = 'Cep';
protected $_messageTemplates = array(
self::CEP => "'%value%' não é um CEP Válido"
);
public function isValid($value)
{
$this->_setValue($value);
if (!preg_match('/^[0-9]{5}-[0-9]{3}$/', $value)) {
$this->_error();
return false;
}
return true;
}
}
No código acima é criada uma classe Validade_Cep que estende a classe Zend_Validade_Abstract e implementa um método isValid() que recebe o valor a ser validado como parâmetro e realiza as verificações necessárias, nesse caso estou verificando o formato do CEP através de uma expressão regular que verifica se o valor possui 5 números seguidos de um hífen e mais 3 números (o padrão do CEP no Brasil) e retorna falso caso não seja e verdadeiro caso esteja dentro do padrão. Além disso no começo da classe foi definida uma mensagem de erro que será atribuída caso o valor recebido não seja compatível com esse padrão.
Após a definição da classe podemos utilizar esse validador da mesma forma que os validadores nativos do Zend_Frameork, como mostrado abaixo:
$string = "00000-000";
$validador = new Validate_Cep();
if ($validador->isValid($string)) {
echo "CEP Válido";
} else {
foreach ($validador->getMessages() as $messageId => $message) {
echo "Falha na Validação '$messageId': $message\n";
}
}
Vale lembrar novamente que é recomendado seguir o padrão de nomenclatura das classes no Zend Framework caso você queira utilizar todos os recursos do Autoload do Framework.
Alterando as Mensagens dos Validadores
Os validadores nativos do Zend Framework possuem suas mensagens padrões já definidas, mas pode ser que você queira altera-las, isso é bastante simples, o exemplo a seguir mostra como deve proceder:
$validator = new Zend_Validate_GreaterThan(); $validator->setMessage( 'O valor informado não é maior do que o necessário', Zend_Validate_GreaterThan::NOT_GREATER );
No exemplo acima, estamos alterando a mensagem do validador que verifica se o valor passado é maior que o mínimo esperado para uma mensagem em português através do método setMessage(), que recebe como primeiro parâmetro a nova mensagem e como segundo uma referência a mensagem quem deve ser substituída.
Conclusão
Validadores são bastante parecidos com filtros, ate mesmo na sua implementação, além disso são comumente utilizados juntamente com formulários mas também tem bastante utilidade fora desse contexto, a combinação dos validadores com os filtros pode ajudar bastante na implementação da sua aplicação e ainda pode auxiliar na segurança da mesma, é sempre recomendado que qualquer dado proveniente do usuário, de outra aplicação externa ou que possa ter sido alterado fora do contexto da sua aplicação seja validado e filtrado para que não hajam problemas de incompatibilidade ou de segurança, as classes do Zend Framework apresentadas nesse artigo e no anterior ajudam bastante nessa tarefa.