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.