Laravel Custom Request: Validando dados de forma organizada

Remova da controladora todas as regras e mensagens de validação para uma camada específica.

Simplificando o desenvolvimento de APIs PHP com Swagger

Sabemos que as controladoras são as partes mais complexas de uma aplicação, já que lidam com diversas regras de negócio, realizam validações, chamam os modelos, entre outras operações. Sempre que possível, utilize novas camadas para manter a controladora mais enxuta.

Quando se trata de validações, podemos usar as famosas Custom Requests do Laravel. Basicamente, elas criam uma nova camada chamada Requests dentro do namespace App\Http. Com esse recurso, podemos criar validações com mensagens para cada método ou validação da nossa aplicação, removendo, assim, essa responsabilidade da nossa controladora.

Para criar uma Custom Request, basta executar o comando Artisan abaixo.

php artisan make:request UserStoreRequest

Note que o nome UserStoreRequest é apenas uma convenção, sendo:

  • User - Referência a controladora;
  • Store - Referência ao método;
  • Request - Sufixo de convenção.

Agora imagine que seja necessário criar validações para o Insert, Update, Filter, dentre outros métodos. Podemos agrupar eles dentro de uma pasta além de utilizar a convenção abordada aqui, veja mais alguns exemplos abaixo.

php artisan make:request User/UserStoreRequest
php artisan make:request User/UserUpdateRequest
php artisan make:request User/UserFilterRequest

Validando dados no Laravel

Dentro da Custom Request, você verá um método chamado Rules que retorna um Array, é nele que você vai inserir as suas regras de negócio, como provavelmente fazia dentro da controladora.

Você pode ver todos os tipos de validação disponível em https://laravel.com/docs/10.x/validation#available-validation-rules.

public function rules(): array
{
        return [
            'nome'  => 'string|required',
            'idade' => 'integer|max:35'
        ];
}

Mensagens de validação no Laravel

Também é possível criar um método chamado messages que retorna um Array, esse método recebe as mensagens de validação em caso de falha, conforme mostra o método abaixo correspondente a validação criada anteriormente.

public function messages()
{
        return [
            'nome.required'  => 'O campo nome é obrigatório.',
            'nome.string'    => 'O campo nome deve ser uma string.',
            'idade.integer'  => 'O campo idade deve ser um número inteiro.',
            'idade.max'      => 'A idade não pode ser superior a 35 anos.',
        ];
}

Validação na Controladora

Até aqui você já deve ter notado que temos as regras e as mensagens, mas como utilizá-las na controladora? A resposta é bem simples, basta assinar o seu método com a classe da Request criada.

Observe no exemplo abaixo que estamos chamando a classe UserStoreRequest como parâmetro para o nosso método store. Observe também que através do método validated() é possível obter todos os campos que foram validados.

<?php

namespace App\Http\Controllers;

use App\Http\Requests\User\UserStoreRequest;

class UserController extends Controller
{
    public function store(UserStoreRequest $request)
    {
        $form = $request->validated();

        dd($form);
    }
}

Continue aprendendo com a nossa videoaula

Assista a videoaula que a gente preparou sobre esse tema, criando todas as validações e exemplificando ainda mais o que foi abordado até aqui.

 

Referências

Validação em Laravel: https://laravel.com/docs/5.5/validation#introduction