VALIDADOR PERSONALIZADO COM LARAVEL 5 + (5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8)

Marabesi
THT Brasil
Published in
3 min readMar 30, 2019

Obs: Esta postagem pressupõe que você entenda os seguintes tópicos na estrutura do Laravel:

  1. Roteadores e controladores.
  2. Usando regras padrão do validador.
  3. O que é um service provider e como usá-lo.

USANDO AS REGRAS DO VALIDADOR

O Laravel vem com recursos para validar seus dados, a documentação oficial tem muitos exemplos para usar. Normalmente, a validação é direta, leva uma solicitação como parâmetro e o segundo parâmetro é um vetor com todas as regras a serem validadas.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BookController extends Controller
{

/**
* @param Request $request dados para validar
*/
public function save(Request $request)
{
// 'campo da requisisção' => 'regra a ser aplicada'
$this->validate($request, [
'title' => 'required',
'author' => 'required|min:3',
]);
}

}

Se alguma regra falhar, o Laravel retornará uma resposta com todos os erros ocorridos. No entanto, é comum ter regras personalizadas já que as regras oferecidas são genéricas, como por exemplo, um campo vazio ou um número mínimo/máximo de caracteres.

Criar um validador personalizado requer duas etapas, a primeira é criar uma classe específica para a regra, e a segunda é registrar essa classe com o service provider.

CRIANDO UMA CLASSE DE VALIDADOR PERSONALIZADO

A primeira etapa é criar uma nova classe e estender o Laravel Validator (um validador personalizado é uma classe em qualquer lugar do seu projeto).

Logo, um detalhe que merece a atenção é o nome da convenção de cada método. É necessário usar o prefixo validate, essa é uma maneira de dizer ao Laravel que esse método pode ser usado para validar dados.

O próprio Laravel Framework usa essa abordagem, a classe Validator traz a validação do core do Framework.

<?php

namespace App\Validators;

use Illuminate\Validation\Validator;

class MinhaRegraPersonalizada extends Validator
{

public function validateMinhaRegraUm($attribute, $value)
{
// código omitido
}
public function validateMinhaRegraDois($attribute, $value)
{
// código omitido
}
}

Observe que estamos sob o namespace App\Validators, o que significa que para este exemplo, temos uma pasta para armazenar todos os validadores.

Agora, antes de usarmos a classe do validador que acabamos de criar, é necessário mais um passo. O Laravel não sabe sobre nossa classe de validação e nós o informamos usando um service provider.

REGISTRANDO O NOVO VALIDATOR COM SERVICE PROVIDER

Todos os parâmetros que são requeridos pelo construtor são da classe do validador do Laravel, portanto, à medida que o estendemos, devemos passar todos os argumentos também.

<?php

namespace App\Providers;

use App\Validators\MinhaRegraPersonalizada;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
public function boot()
{
$this->app->validator->resolver(function($translator, $data, $rules, $messages) {
return new MinhaRegraPersonalizada($translator, $data, $rules, $messages);
});
}

public function register()
{}
}

Portanto, agora estamos prontos para usar nosso validador personalizado e, para isso, adicionamos a regra que criamos a qualquer campo que desejarmos.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BookController extends Controller
{

public function save(Request $request)
{
$this->validate($request, [
'title' => 'minha_regra_um',
'author' => 'minha_regra_dois',
]);
}

}

Aqui, alteramos a regra obrigatória para aquela que criamos. O nome é o mesmo do método, mas com o padrão sneak_case e sem o prefixo de validação.

DICAS IMPORTANTES

Usamos a classe AppServiceProvider para registrar nosso validador, é prático e rápido. Mas, dependendo da situação, você deve criar seu próprio service provider para registrar essas classes.

ARMADILHA DE CAMPOS VAZIOS

Validações personalizadas não aceitam campos vazios por padrão. Se esse comportamento for desejado, é necessário sobrescrever a propriedade $implicitRules, caso contrário seu método de validação não será acionado.

Postado originalmente em https://marabesi.com/php/2017/05/31/laravel-custom-validator.html

--

--

Marabesi
THT Brasil

Trying to inspire people through software development