Usando a biblioteca Respect Validation no Laravel

Por padrão, o Laravel vem com vários validadores. Mas sempre tem aquela aplicação que precisa de uma validação específica, seja CPF, CEP, cartão de crédito e etc.
Nesse pequeno texto vou mostrar como adicionar regras poderosas ao validador do Laravel, usando a biblioteca Respect Validation, a biblioteca de validação mais foda já criada para o PHP.

Assumindo que você já tem um projeto Laravel criado, vamos instalar a biblioteca:

$ composer require respect/validation

No momento da escrita desse texto, a versão estável da lib é a 1.1. Mas a 2.0 está pra sair, com novos validadores, etc e tal.
Se você quiser experimentar essa versão ainda não estável, basta usar o comando composer require respect/validation dev-master.

Depois de instalada a lib, vamos ver como adicionar regras ao Laravel.
Eu costumo criar um Service Provider para agrupar todas as minhas regras.

No arquivo “app/Providers/ValidatorServiceProvider.php” adiciono as validações no método “boot”. No exemplo abaixo adiciono um validador de CPF:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
use Respect\Validation\Rules as RespectRules;

class ValidatorServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Validator::extend('cpf', function($attribute, $value, $parameters, $validator) {
            return (new RespectRules\Cpf())->validate($value);
        });
    }
}

Também, adicione esse provider ao arquivo de configuração “config/app.php”:

<?php

return [
    //...
    'providers' => [
        //...
        /*
         * Application Service Providers...
         */
        //...
        App\Providers\RouteServiceProvider::class,
        App\Providers\ValidatorServiceProvider::class,
    ],
];

Feito isso, você deve adicionar uma mensagem de erro de validação em seu(s) arquivo(s) de tradução(ões), para que seja retornada uma mensagem clara caso o campo esteja inválido.
Esse arquivo é “resources/lang/{idioma}/validation.php”, onde “{idioma}” é a sigla do idioma, exemplo “resources/lang/en/validation.php”:

<?php

return [
    'accepted' => 'The :attribute must be accepted.',
    // ...
    'uuid' => 'The :attribute must be a valid UUID.',
    'cpf' => 'Invalid CPF format or last two verification digits',
    //...
];

Repare que eu não coloquei o campo “cpf” ali em cima, junto aos validadores com a letra C, mantendo a ordem alfabética.
Particularmente eu prefiro colocar meus validadores customizados no fim da lista, para não misturar com os padrões do framework.

Agora, em seus controllers ou formRequests você pode colocar a regra “cpf” no campo:

class CreateUserRequest extends FormRequest
{
    public function rules()
    {
        return [
            'cpf' => 'required|cpf|unique',
    ];
    }
}

E para adicionar mais validadores é só continuar enchendo o método “boot”, e claro, preencher o(s) arquivo(s) de tradução(ões) com as mensagens de erro…

CNPJ:

        Validator::extend('cnpj', function($attribute, $value, $parameters, $validator) {
            return (new RespectRules\Cnpj())->validate($value);
        });

CEP do Brasil:

        Validator::extend('cep', function($attribute, $value, $parameters, $validator) {
            return (new RespectRules\PostalCode('BR'))->validate($value);
        });

E por aí em diante. Respect Validation tem diversos validadores úteis, como CNH, cartão de crédito, número romano, entre muitos outros.
Nesse texto eu quis mostrar como eu a uso em projetos Laravel, mas ela também pode ser usada independente de qualquer framework, sem problema nenhum, inclusive sua interface fluente para combinar validadores é sensacional.

Bom, é isso.
Qualquer crítica, dúvida, elogio ou sugestão… Ping me or comment here!

4 respostas para “Usando a biblioteca Respect Validation no Laravel”

    1. Oi, Leonardo.
      Você pode usar a regra OneOf do Respect:


      Validator::extend('document', function($attribute, $value, $parameters, $validator) {
      return (new RespectRules\OneOf(
      new RespectRules\Cnpj(),
      new RespectRules\Cpf()
      ))->validate($value);
      });

      Nesse caso ele aceita um dos dois; CPF ou CNPJ.

      Vlw!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *