Pesquise

3 de jan. de 2016

Validação personalizada no Laravel 5.2

Pesquisei vários métodos de implementar uma validação personalizada, mas vários deles dizem para registrar o método em algum ServiceProvider, sem falar nas mensagens de erro. A documentação do Laravel também não ajuda, tratando o tópico bem brevemente.

Eu estava procurando algo que não precisasse mudar vários arquivos, e que a validação não ficasse em outra classe além da Request que criei para a validação. Assim, apresento a solução que encontrei.

Assumindo que você está fazendo a validação através de um Form Request, além dos métodos tradicionais authorize() e rules(), você pode criar seu método de validação personalizado, e sobrescrever o método getValidatorInstance() da classe Request para adicionar seu método no procedimento de validação.

Vamos supor que no nosso formulário temos um campo numero_par que, como o nome sugere, deve ser um número par. Criamos então nosso método de validação na nossa classe FormularioRequest:

public function validatePar($validator)
{
    if( $this->numero_par % 2 != 0 )    // se o número não for par
    {
        $validator->errors()->add('numero_par', 'Insira um número par');
    }
}

Sobrescrevemos então o método getValidatorInstance():

public function getValidatorInstance()
{
    $validator = parent::getValidatorInstance();

    // Validação personalizada
    $validator->after(function () use ($validator)
    {
        $this->validatePar($validator);
    });

    return $validator;
}

Nossa classe completa ficaria então como:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use Validator;

class FormularioRequest extends Request
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'numero_par'    => 'required|numeric',
        ];
    }

    public function getValidatorInstance()
    {
        $validator = parent::getValidatorInstance();

        // Validação personalizada
        $validator->after(function () use ($validator)
        {
            $this->validatePar($validator);
        });

        return $validator;
    }
    
    public function validatePar($validator)
    {
        if( $this->numero_par % 2 != 0 )    // se o número não for par
        {
            $validator->errors()->add('numero_par', 'Insira um número par');
        }
    }
}

Note que, diferente das outras formas de adicionar uma validação personalizada, esta aqui não registra uma regra de validação para você usar no array de regras. Este método se torna útil quando você deseja executar uma operação específica de um model, principalmente se envolve outros campos do mesmo formulário.

Nenhum comentário:

Postar um comentário