Skip to content

Laravel, como validar um input sem repetir código nas actions? E evitar o tão famoso code smell nas actions?

Uma das coisas que sempre combatemos em code smell “por default” é a capacidade de inibir código duplicado. Sempre temos que pensar em uma forma de não haver duplicidade de código. Imagine o seguinte cenário no Laravel (nas actions produtos.store e produtos.update):

        $request->validate([
            'nome' => ['required', 'min:3']
        ]);

Imagine que o nome do produto precisa passar por dois momentos de validação, o de store e o de update (nas actions store/update respectivamente). Para termos essa validação iríamos copiar esse código em ambas actions e funcionaria. Mas para dar manutenção nesse código haveriam dois lugares para tal, sem contar que é código repetido (veja o link que falo sobre messagebag e $errors no Laravel). É notório que á code smell ali se replicarmos aquela validação de exemplo e para sanar isso a forma correta é criar um FormRequest NOSSO e aí sim trabalhar nele para aplicar essa validação em especial. Vamos criar isso com artisan:

no console digite:

php artisan make:request ProdutosFormRequest

O Laravel sozinho vai criar a classe ProdutosFormRequest dentro da pasta /var/www/laravel/app/Http/Requests/ProdutosFormRequest.php

Dentro dele precisamos nos ater a dois pontos, o de permitir as requisições sem restrição e as regras de filtros dessas requisições, no caso, em primeiro passo precisamos entrar em:

public function authorize()
{
    //precisamos mudar o authorize para TRUE se quisermos que todos //estejam autorizados a usar esse formrequest
    //return false;
    return true;
}

Isso já nos garantirá que o user vai poder fazer essa request sem problemas e como essa classe herda tudo da FormRequest a gente não precisa se preocupar com a compatibilidade dos membros dessa classe porque tudo vai funcionar armoniosamente!

O segundo ponto em questão é o filtro do form que está logo abaixo:

    public function rules()
    {
        return [
            'nome' => ['required', 'min:3']
        ];
    }

Por padrão ele vem com // no corpo do return [], basta inserirmos a filtragem que queremos. E em nossas actions store/update ao invés de deixarmos Request $request como argumentos dos métodos store/update a gente coloca nosso form request:

    public function update(CadastroProdutos $produtos, ProdutosFormRequest $request) {

e 
   public function store(ProdutosFormRequest $request)
    {

Resolvido, sanamos code smell e ainda otimizamos o nosso código <3.

One Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.