4.3 Validação Personalizada

Levando as validações do seu formulário a outro nível

Nós queremos ampliar os horizontes

Nosso objetivo criando o SuitUp nunca foi monopolizar seu projeto, ingessando-o para que você não utilize nada fora do nosso escopo, muito pelo contrário, em vez de ficar reinventando a roda, se existe uma ferramenta que faz o que precisamos e que funciona muito bem, então por que não utilizá-la?

O SuitUp te ajuda com diversas situações previstas e comuns de validação de formulários, além disso você pode inserir as validações do Zend Framework (Github) que inclusive já são marcadas pelo SuitUp como dependências no composer, ou seja, ao utilizar o composer para fazer o download do SuitUp você estará automaticamente baixando as bibliotecas de validações do Zend também.

Mesmo depois de tudo isso, você muito provavelmente irá encontrar em seu sistema situações de validações que nem nós do SuitUp nem o pessoal do Zend Framework previu. Para isso você pode muito facilmente criar seus próprios métodos de validação.

Como fazer?

Dentro da sua classe de formulário (vamos usar de ex.: ModuleDefault/Form/Index/Index.php) basta adicionar um método com visibilidade pelo menos protected que recebe no máximo dois parâmetros sendo o primeiro obrigatório:

1
2
 (string) $value; // OBRIGATÓRIO - O método receberá automaticamente o valor do input neste parâmetro
 (mixed) $options; // Opções que não são obrigatórias.

Este método deve retornar um stdClass com dois atributos (error e message).

Exemplo
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
// File: ModuleDefault/Form/Index/Index.php
namespace ModuleDefault\Form\Index;

use SuitUp\FormValidator\AbstractFormValidator;

class Index extends AbstractFormValidator {

    protected $data = array(
        'name' => array(
            'validation' => array('notEmpty', 'randErr', 'randInvalid' => 'Mensagem personalizada'),
            'filter' => array('string')
        ),
    );

    // Exemplo simples de validacao
    public function randErr($value) {
        $result = new \stdClass();
        $result->error = false;
        $result->message = '';

        // Casualmente retorna 1 e gera erro
        if (rand(0, 1) == 1) {
            $result->error = true;
            $result->message = "Este método retorna erro aleatoriamente";
        }

        return $result;
    }

    // Este é um exemplo mais complexo, com opções
    public function randInvalid($value, $options = null) {
        $result = new \stdClass();
        $result->error = false;
        $result->message = "";

        if (is_int($value) && ($value%2) == 0) {

            $result->error = true;

            // Verifica se foi passado parametro 'mensagem'
            if (isset($options['message']) {
                $result->message = $options['message'];

            // Verifica se foi passado simplesmente mensagem
            } elseif (is_string($options)) {
                $result->message = $options;

            // Mensagem padrao (sem parametro)
            } else {
                $result->message = 'Um erro foi detectado';
            }                
        }

        return $result;
    }
}

Extendendo a classe \SuitUp\FormValidator\AbstractFormValidator

Uma das grandes vantagens de utilizar Programação Orientada a Objetos do PHP é o conceito de herança. Não vamos entrar no mérito de explicar o que este conceito significa então na prática o SuitUp foi construído para você criar a sua classe de formulário herdando (extends) à \SuitUp\FormValidator\AbstractFormValidator fazendo com que sua classe tenha todas as características dela sem alterá-la.

Desta maneira, quando você criar em sua classe de formulário um método de validação ele será visível apenas dentro deste único formulário. Mas se por outro lado você tiver uma classe no "meio do caminho" que herda (extende) à \SuitUp\FormValidator\AbstractFormValidator e todas as suas classes de formulário herdar dela você irá compartilhar os seus métodos de validação com todos seus formulários.

Parece, mas não é complicado!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
\SuitUp\FormValidator\AbstractFormValidator

                          ^
                          |

\ModuleDefault\Form\AbstractFormPersonal extends AbstractFormValidator

                          ^
                          |

\ModuleDefault\Form\Index\IndexForm extends AbstractFormPersonal 
\ModuleDefault\Form\Index\ListForm extends AbstractFormPersonal 
\ModuleDefault\Form\Index\EditForm extends AbstractFormPersonal