Zend Validator - aprendendo a criar validações customizadas
Na sequência de posts sobre o Zend Framework já falei sobre os primeiros passos, forms, filters e chegou a vez do Zend Validator.
Antes de qualquer coisa
Sugiro a leitura destes posts exatamente na sequência para que consiga chegar neste post entendendo o porquê de alguns nomes de classes que utilizaremos aqui.
- Zend Form - Trabalhando com formulários no Zend Framework 2 e 3
- Zend Form - Injeção de dependências
- Zend Filter - Aprendendo criar filtros customizados
Além disso, te convido a ler os demais posts sobre o ZF que eu escrevi acessando este link.
O que é o Zend Validator?
É um componente do Zend Framework para possibilitar diversas validações. Assim como os filtros, mencionados no post sobre o Zend Filter, você pode utilizar o validator tanto no ZF, em outro framework e até mesmo de forma avulsa.
Por que usar Zend Validator?
Assim como os filtros, você já conta com diversos validadores pré definidos, basta configurar a regra e pronto. Veja todas as possibilidades no GitHub.
Estrutura básica de um validador
namespace Application\Validator;use Zend\Validator\AbstractValidator;
class FloatVal extends AbstractValidator
{
const FLOAT = 'float';protected $messageTemplates = [
self::FLOAT => "'%value%' is not a floating point value",
];public function isValid($value)
{
$this->setValue($value);if (! is_float($value)) {
$this->error(self::FLOAT);
return false;
}return true;
}
}
É bem simples, basta estender de AbstractValidator e sobrescrever o método isValid. Ali basta criar a sua regra de validação.
NameAndLastNameValidator
Como exemplo, vamos criar um validador de nome e sobrenome. A intenção é que ao receber algo que foi inputado em um formulário, validemos se possui duas sentenças caracterizando o nome e sobrenome.
namespace Application\Validator;use Zend\Validator\AbstractValidator;
class NameAndLastName extends AbstractValidator
{
// definindo a chave de erro
const INVALID = 'nameAndLastNameInvalid';// Mapeando os possíveis erros
/**
* @var array
*/
protected $messageTemplates = [
self::INVALID => "Please provide your name and last name",
];/**
* @inheritdoc
*/
public function isValid($value)
{
// separando a string a partir dos espaços em branco
$words = explode(' ', $value);// vefiricando se a string resultou em mais de 1 palavra
$valid = count($words) > 1;// caso o resultado seja apenas uma palavra, a validação indica o erro
if (!$valid) {
$this->error(self::INVALID);
return false;
}return true;
}
}
InputFilter
Por fim, basta adicionar o validador em nosso input filter.
// module/Application/src/Form/ExampleFormFilter
$inputFilter->add([
'name' => 'nome',
'required' => true,
'filters' => [
['name' => StripTags::class],
['name' => StringTrim::class],
],
'validators' => [
// outros validadores, se necessário
[
'name' => \Application\Validator\NameAndLastName::class
]
],
]);
Muito simples, não? Assim que setar os dados na classe de form e solicitada a validação, o nome será verificado se é composto de nome e sobrenome.
Como usar fora do InputFilter
Se precisa utilizar fora do form, é bem simples, basta instanciar a classe do validador e utilizar o método isValid passando a string a ser validada.
$nameAndLastName = new \Application\Validator\NameAndLastName(); $string = 'retorno_false'; $string2 = 'retorno true';$nameAndLastName->isValid($string);
// false$nameAndLastName->isValid($string2);
// true
E como ver quais foram os erros?
Basta chamar o método getMessages(). Veja o exemplo.
$validator = new \Application\Validator\NameAndLastName(); $string = 'return_false';var_dump($validator->isValid($string));
print_r($validator->getMessages());
// Saída
/*
Array
(
[nameAndLastNameInvalid] => Please provide your name and last name
)
*/
Isso que é o bonito de se trabalhar com um Framework robusto como o Zend. Você faz as coisas do seu jeito, e sempre reaproveita para os mais diversos casos. Quando você junta tudo, fornece uma boa camada de segurança à sua aplicação. A definição do Form permite que os formulários sejam precisos e a utilização dos filtros permite limpar possíveis dados maliciosos. A validação por fim permite que os dados inputados pelo usuário estejam condizentes com o que você persistirá no banco de dados.
Pra finalizar
Sempres estou escrevendo sobre o ZF, se quiser receber notificações de quando publico algo novo, ativa o sininho aí em baixo que você será avisado(a) assim que o novo conteúdo for ao ar.