Fork me on GitHub

O mecanismo de validação mais impressionante criado em PHP.

Instalação

O pacotes estão disponiveis no Pear e Composer. Autoloading é compativel com PSR-0.

Recursos


Importação do Namespace

Respect\Validation é namespace, mas você pode tornar sua vida mais fácil importando apenas a classe em seu contexto:

	use Respect\Validation\Validator as v;

Validação Simples

O Hello World do validador é somente isto:

	$number = 123;
	v::numeric()->validate($number); //true

Chained Validation | Validação Chained

É possivel utilizar os validadores em cadeias(chain). O exemplo abaixo valida um conjunto de caracteres que contém números e letras, sem espaços e está entre 1 e 15:

	$usernameValidator = v::alnum()->noWhitespace()->length(1,15);
	$usernameValidator->validate('alganet'); //true

Validating Object Attributes | Validação de Atributos de Objeto

Dados o simples Objeto a seguir:

	$user = new stdClass;
	$user->name = 'Alexandre';
	$user->birthdate = '1987-07-01';

É possivel validar seu atributos em uma única chain:

	$userValidator = v::attribute('name', v::string()->length(1,32))
                  ->attribute('birthdate', v::date()->minimumAge(18));

	$userValidator->validate($user); //true

Validar chaves de array também é possivel utilizando v::key()

Note que usamos v::string() e v::date() no inicio do validador. Embora não seja obrigatório, é uma boa prática usar o tipo do objeto validado como o primeiro nós na cadeia(chain).

Input optional | Entrada Opcional

Todos os validadores tratam a entrada como opcional e aceitarão cadeia de caracteres válidos vazia, salvo alguma indicação contrária na documentação.

Nós usamos o validador v::notEmpty() prefixado para não permitir a entrada vazia e efetivamente definimos o campo como obrigatório, os inputs serão requeridos ou a validação falhará.

	v::string()->notEmpty()->validate(''); //false input required

Negating Rules | Negando Regras

Você pode usar v::not() para negar qualquer regra:

    v::not(v::int())->validate(10); //false, input must not be integer

Validator Reuse | Reutilização de Validador

Uma vez criado, você pode reutilizar seu validador em qualquer lugar. Lembra $usernameValidator?

    $usernameValidator->validate('respect');            //true
    $usernameValidator->validate('alexandre gaigalas'); //false
    $usernameValidator->validate('#$%');                //false

Informative Exceptions | Exceptions Informativas

Quando algo está errado, o Validation pode dizer o que esta acontecendo exatamente. Para isso usamos o método assert() em vez de validate()

    try {
        $usernameValidator->assert('really messed up screen#name');
    } catch(\InvalidArgumentException $e) {
        echo $e->getFullMessage();
    }

A mensagem impressa é exatamente esta, como uma árvore de texto:

    \-All of the 3 required rules must pass
     |-"really messed up screen#name" must contain only letters (a-z) and digits (0-9)
     |-"really messed up screen#name" must not contain whitespace
    \-"really messed up screen#name" must have a length between 1 and 15

Getting Messages | Recebendo mensagens

A árvore de texto lançada pela exception é bom, mas inútilizável em um formulário html ou algo mais personalizado. Você pode usar o findMessages() para isso:

    try {
        $usernameValidator->assert('really messed up screen#name');
    } catch(\InvalidArgumentException $e) {
        var_dump($e->findMessages(array('alnum', 'length', 'noWhitespace')));
    }

findMessages() retorna um array com as mensagens do validadores solicitados.

Custom Messages | Mensagens Customizadas

Pegar as mensagens como array é muito legal, mas as vezes você precisa customiza-las para poder apresentar aos usuários. Isto é possivel utilizando o método findMessages() assim:

       $errors = $e->findMessages(array(
        'alnum'        => '{{name}} must contain only letters and digits',
        'length'       => '{{name}} must not have more than 15 chars',
        'noWhitespace' => '{{name}} cannot contain spaces'
    ));

Para todas as mensagens, a variável {{name}} e {{input}} estão disponiveis para o template.

Validator Name | Nome do validador

Em v:: attribute() e v::key(), {{name}} é o nome do attribute/key. Você pode customizar um validador usando um nome:

    v::date('Y-m-d')->between('1980-02-02', 'now')->setName('Member Since');

Zend/Symfony Validators | Validadores Zend/Symfony

É possivel utilizar também validadores de outros frameworks, se eles estiverem devidamente instalados:

    $hostnameValidator = v::zend('Hostname')->assert('google.com');
    $timeValidator     = v::sf('Time')->assert('22:00:01');

Validation Methods | Métodos de Validação

Já vimos o Validate() que retorna true ou false e assert() que lança um relatório de validação completa. Há também um método chamado check() que retorna uma exceção com o primeiro erro encontrado apenas:

    try {
        $usernameValidator->check('really messed up screen#name');
    } catch(\InvalidArgumentException $e) {
       echo $e->getMainMessage();
    }

Mensagem:

    "really messed up screen#name" must contain only letters (a-z) and digits (0-9)

Reference | Referência

Types | Tipos

Generics | Genéricos

Comparing Values | Comparando Valores

Numeric

String

Arrays

Objects | Objetos

Date and Time | Datas e Horas

Group Validators | Grupo de Validadores

Regional

Files

Other

Alphabetically | Alfabético

v::allOf($v1, $v2, $v3...)

Irá validar se todos os validadores internos forem válidos:

    v::allOf(
        v::int(),
        v::positive()
    )->validate(15); //true

Isto é semelhante a cadéia, porém sua sintaxe permite definir nomes personalizados para cada nó:

    v::allOf(
        v::int()->setName('Account Number'),
        v::positive()->setName('Higher Than Zero')
    )->setName('Positive integer')
        ->validate(15); //true

Veja também:

v::alnum()


v::alnum(string $additionalChars)

Validadores de caracteres alfanumérico de a-Z e 0-9

    v::alnum()->validate('foo 123'); //true

Um parâmetro para caracteres extras, também pode ser adicionado:

    v::alnum('-')->validate('foo - 123'); //true

Este validador permite espaços em branco, caso você queira removê-los, acrescente o método ->noWhitespace() a cadeia:

    v::alnum()->noWhitespace->validate('foo 123'); //false

Por default os valores vazios(empty) são aceitos, caso você queira invalidá-los, adicione o método ->notEmpty() à cadeia:

    v::alnum()->notEmpty()->validate(''); //false

Você pode restringir os casos usando os validadores ->lowercase() e ->uppercase():

    v::alnum()->uppercase()->validate('aaa'); //false

Template message para este validador inclui {{additionalChars}} com uma cadéia de caracteres passadas como parâmetros.

Veja também: