Recebendo requisições de formulário com o Laravel

Para obtermos os campos do formulário precisamos respeitar algumas convenções e usar um método da classe Request.

Simplificando o desenvolvimento de APIs PHP com Swagger

Quando desenvolvemos aplicações na qual dados vem de formulários, precisamos seguir algumas regras, como inserção do @CRSF e manter uma estrutura de nomes, por exemplo. No geral o processo para obter os inputs no Laravel é rápido, seguro e como sempre, muito fácil.

Basicamente precisamos definir os atributos name, incluir a marcação de @crsf e por fim, chamar o método input da classe Request. Vale lembrar que também é necessário definir as rotas com os verbos corretamente.

Antes de mais nada, vamos registrar as nossas rotas no arquivo routes\web.php, conforme mostra o exemplo abaixo.

Route::prefix('form')->group(function () {
    Route::get('/', [FormController::class, 'index']);
    Route::post('/', [FormController::class, 'store'])->name('form.store');
});

Nosso acesso fica da seguinte forma: http://127.0.0.1:8000/form.

Okay, com as rotas prontas a gente vai começar criar agora o nosso formulário, veja todo o código abaixo.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Requisição - Laravel</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
</head>

<body>
    <div style="max-width:500px;width:100%;margin:0 auto;margin-top:5%">
        <form action="{{ route('form.store') }}" method="post">
            @csrf
            <div>
                <label for="nome" class="form-label">Nome:</label>
                <input type="text" id="nome" name="nome" placeholder="Informe seu nome completo" class="form-control">
            </div>

            <div class="mt-3">
                <label for="email" class="form-label">E-mail:</label>
                <input type="email" id="email" name="email" placeholder="email@dominio.com" class="form-control">
            </div>

            <div class="mt-3">
                <input type="submit" class="btn btn-primary" value="Enviar">
            </div>
        </form>
    </div>
</body>

</html>

Dentro da tag form, nós apontamos o action para a rota form.store, você pode observar que nas nossas rotas a gente definiu o ->name() com esse valor. Assim que a gente enviar o formulário, o próprio Laravel se encarrega de chamar a página certa.

<form action="{{ route('form.store') }}" method="post">

Na sequencia, nós precisamos informar o atributo @csrf, que é um método padrão de proteção dos formulário.

...
@csrf
<div>

Agora devemos tomar cuidado ao declarar nossos inputs, é importante que o atributo name esteja presente. O valor do atributo será utilizado par fazer a captura do campo digitado, então mantenha uma padronização nesses nomes.

<input type="text" id="nome" name="nome"...


Até aqui a gente tem toda nossa aplicação preparada para enviar os dados, agora nos resta de fato captura-los. Para isso, vamos utilizar o método input da classe Request, classe essa que deve estar assinada no método, como mostra o código abaixo.

    public function store(Request $request)
    {
        $nome = $request->input('nome');
        $email = $request->input('email');

        return response()->json([
            'nome' => $nome,
            'email' => $email
        ]);
    }

Criamos um método chamado store que recebe por injeção de dependência todas as informações da requisição. Obtemos as informações através da variável $request, que por sua vez nos fornece o acesso ao método input, que recebe como parâmetro o nome do campo que definimos no nosso formulário.

Como definimos: 

<input type="text" id="nome" name="nome"...

Como capturamos:

$request->input('nome');

A título de testes, exibimos o resultado em uma resposta Json.

Apenas para reforçar, no início do nosso arquivo devemos utilizar o namespace do Resquest, caso o seu arquivo não tenha, basta incluí-lo.

use Illuminate\Http\Request;

E assim finalizamos mais um artigo prático.