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.

  1. Zend Form – Trabalhando com formulários no Zend Framework 2 e 3
  2. Zend Form – Injeção de dependências
  3. 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.

Menu