Laravel controller com validation

Laravel

Nem sempre podemos contar com a integridade dos usuários que utilizam o nosso site ou plataforma, e se um usuário mal intencionado acessar o seu site, sem as corretas validações, você pode enfrentar vários problemas, de vazamento de dados, até um completo shutdown no seu sistema. Então vamos aprender como trabalhar com validações aqui.

O Problema

Vamos imaginar que temos essas rotas no nosso sistema:

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'create']);
Route::post('/user', [UserController::class, 'store']);

e nossa tabela no banco de dados tem esse modelo:

idnameemailmobilerole
fd9f5d6b0940James Oliverjames@example.com01093131312admin
928667699a0cClaudia Moreiraclaudia@myweb.com01294912912user
e22334d2778ePatricia Tavarespatricia@domain.com01291012921editor

A rota GET exibirá um formulário para o usuário criar um novo projeto, enquanto a rota POST irá armazenar o novo projeto no banco de dados.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function create()
    {
        return view('user.create');
    }
    
    // Registra o usuario no banco de dados
    public function store(Request $request)
    {
        User::create([
            $request->all()
        ]);
    }
}

Porque o código acima é uma idea terrível?

Simplesmente por que nesse cenário você da total liberdade para o usuário, armazenar basicamente qualquer coisa no seu banco de dados.

O usuário pode simplesmente implantar um campo escondido no seu formulário para tentar submeter informação extra. Por exemplo:

 <input type="hidden" id="role" name="role" value="admin" />

Imagine algo como o campo acima, assim que o usuário submeter esse formulário, ele vai receber os privilégios de um admin!

Solução: Validação

O primeiro passo para validação é utilizar o método validate fornecido pelo objeto Illuminate\Http\Request. Se as regras de validação passarem, seu código continuará executando normalmente; entretanto, se a validação falhar, uma exceção será lançada e a resposta de erro apropriada será automaticamente enviada de volta para o usuário.

No exemplo acima, podemos utilizar o método validate diretamente no parâmetro request.

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function create()
    {
        return view('user.create');
    }

    // Registra o usuario no banco de dados
    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:80',
            'mobile' => 'required|digits:11',
        ]);
        // Os valores dentro da request já estão validados nesse ponto
        $validated_with_role = array_merge($validated, ['role' => 'user']);
        User::create($validated_with_role);
    }
}

O método validate é bem direto, ele usa uma array associativo onde, as chaves são o que você espera receber na request e os valores do lado direito são as regras que você quer aplicar para cada campo, individualmente.

Como você pode ver, não estamos validando o campo role então se um usuário tentar enviar esse valor em uma request, ele vai ser completamente ignorado. Ao invés, estamos passando o role do usuário dentro do controller, completamente fora do alcance do usuário.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

0 Comments