Como criar regras de validação personalizadas no Laravel

O Laravel fornece um rico conjunto de regras de validação que você pode adicionar para validar as solicitações. O que é bom sobre o framework não é apenas que ele oferece um monte de recursos integrados, mas também permite que você estenda sua funcionalidade e crie seu próprio conjunto de regras, que você pode usar em mais de um projeto.

Neste tutorial, aprenderemos como criar uma regra de validação personalizada no Laravel 9.

Na maioria dos casos, as regras fornecidas pelo Laravel são suficientes para validar todos os casos de uso, mas em certas condições, pode ser necessário adicionar regras de validação personalizadas. Vamos nos aprofundar e dar uma olhada em como podemos definir regras personalizadas e habilitá-las para validar nossas solicitações.

Criar uma solicitação de formulário

É uma boa prática encapsular suas regras de validação no objeto de solicitação de formulário.

php artisan make:request UserRequest
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            'name'=>'required|max:255',
            'email'=>'required|email|unique:users',
            'birth_year'=>'required'
        ];
    }
}

Como você pode ver, existem dois métodos que já estão presentes na classe:

  • Authorize method:  É utilizado para definir as regras de autorização. Isso pode ajudá-lo a determinar quem tem acesso a essas páginas.
  • Método de regras:  Este é o método onde você adicionaria suas regras de validação. Estamos validando nome, e-mail e ano de nascimento.

Criando Classe de Regra

Como acabamos de ver, criamos um Modelo de Cliente que possui nome e e-mail. Agora vamos adicionar algumas regras para validar esses campos. Você pode executar o comando abaixo para criar uma regra personalizada.

php artisan make:rule BirthYearRule
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class BirthYearRule implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return $value >= 1990 && $value <= date('Y');
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return "The :attribute must be between 1990 to ".date('Y').".";
    }
}

Como você pode ver, há duas funções que precisamos implementar na classe acima. Estes são passes() e message().

Adicionando lógica de validação

Depois de adicionar a classe de regra de validação, vamos adicionar também a lógica de validação. Para este exemplo, vamos considerar que o ano de nascimento é maior ou igual a 1990 e menor ou igual ao ano atual. Portanto, iremos em frente e atualizaremos nossa função de passes.

/**
* Determine if the validation rule passes.
*
* @param  string  $attribute
* @param  mixed  $value
* @return bool
*/
public function passes($attribute, $value)
{
    return $value >= 1990 && $value <= date('Y');
}

Como uma boa prática de codificação, devemos atualizar a função message(). Na função message(), estamos especificando a mensagem que seria mostrada, caso ocorra o erro de validação.

/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
    return "The :attribute must be between 1990 to ".date('Y').".";
}

Usando a regra de validação na classe de solicitação de formulário

Agora que criamos a regra de validação, vamos adicionar a validação na classe de solicitação de formulário que adicionamos acima.

A primeira etapa seria importar essa classe recém-criada para nossa classe de solicitação. Podemos importar usando o código abaixo:

use App\Rules\BirthYearRule;

Agora que importamos a classe, vamos atualizar e atualizar o método rules().

/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
    return [
        'name'=>'required|max:255',
        'email'=>'required|email|unique:users',
        'birth_year'=>['required', new BirthYearRule]
    ];
}

Como você pode ver, agora adicionamos uma validação extra na lista de regras de nomes. Estamos criando uma nova instância da classe BirthYearRule. Quando o método rules() for executado, a classe BirthYearRule será instanciada e chamará o método passes() na classe BirthYearRule para validar o nome.

Usando a regra de validação no controlador

O método acima de adicionar a regra na solicitação de formulário é útil quando você está criando o objeto de solicitação. A classe de regras também pode ser adicionada diretamente ao código do controlador. Vamos ver rapidamente como podemos implementar a classe BirthYearRule diretamente no controlador.

Novamente, a primeira etapa seria importar a BirthYearRule diretamente para a classe do controlador. Podemos usar o código abaixo para importar diretamente a classe.

use App\Rules\BirthYearRule;

Depois de importar a classe, a próxima etapa seria adicionar a chamada de validação.

$request->validate([
    'name'=>'required|max:255',
    'email'=>'required|email|unique:users',
    'birth_year'=>['required', new BirthYearRule]
])

Como você pode ver na função de validação de solicitação, adicionamos uma nova regra na validação de nome. Estamos criando um novo objeto da classe BirthYearRule. Durante esta chamada, um novo objeto de BirthYearRule será criado e a validação ocorrerá.

Regra de validação personalizada usando fechamentos

Agora que vimos como podemos criar nossas regras de validação personalizadas usando o make:rulecomando, devemos entender como podemos criar comandos usando encerramentos. O conceito da regra de validação permanece o mesmo, apenas é implementado de uma forma diferente.

$validator = Validator::make($request->post(),[
    'birth_year'=>[
        'required',
        function($attribute, $value, $fail){
            if($value >= 1990 && $value <= date('Y')){
                $fail("The :attribute must be between 1990 to ".date('Y').".");
            }
        }
    ]
]);

Como podemos ver no código acima, estamos usando a classe Validator e fazendo a regra diretamente. A função nele está obtendo 3 valores: atributo, valor e falha. O atributo é o campo para o qual a validação está acontecendo. O valor corresponde ao valor real do referido objeto e a falha é o método de callback que seria executado quando a validação falhar.

Codificação feliz!!!

1.10 GEEK