Laravel Validation com Form Request

Laravel

No último artigo nós falamos como você pode validar os campos de um formulário dentro do controller.

Para o exemplo do artigo anterior, validar dentro do controller é ok, pois o formulário tem poucos campos e não fica complexo de ler ou de ajustar as regras se necessário.

Mas as vezes a validação é bem mais complexa ou o seu formulário tem muitos campos, nesse caso, usar o Form Request faz bem mais sentido.

As Form Request são classes de requests personalizadas que encapsulam sua própria lógica de validação e autorização.

Ok, um pouco complexo, mas o exemplo abaixo vai ajudar a entender melhor.

Digamos que tenhamos essas regras de validação:

        $validated = request()->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:80',
            'mobile' => 'required|digits:11',
            'address1' => 'required|email|max:80',
            'postcode' => 'required|digits:11',
            'state' => 'required|string|in:ES,RJ,SP,MG',
            'street' => 'required|string|max:80',
            'suburb' => 'required|string|max:80',
            'apt_number' => 'string|numeric|required_if:house_number,null',
            'house_number' => 'string|numeric|required_if:apt_number,null',
        ]);

Como criar um Form Request

Como você pode ver, são regras mais complexas que no exemplo anterior. Nesse caso, o controller talvez já não seja mais o lugar ideal para essa validação.

Vamos criar o nosso Form Request para armazenar essas regaras. Vamos utilizar o comando make:request do artisan para isso.

php artisan make:request StoreUserRequest

Agora, se você olhar na pasta App/Http/Requests você vai ver a nossa nova classe que deve ser parecida com essa abaixo:

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreProjectRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [ ];
    }
}

Ok, a primeira coisa que precisamos fazer, é mudar o return do método authorize() de false para true, esse método verifica se o usuário tem autorização para executar essa request, mas não vamos trabalhar com isso agora, vamos apenas validar os campos do usuário.

O próximo passo então é colocar todas aquelas regras dentro do método rules().

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest 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
     */
    public function rules()
    {
        return [ 
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:80',
            'mobile' => 'required|digits:11',
            'address1' => 'required|email|max:80',
            'postcode' => 'required|digits:11',
            'state' => 'required|string|in:ES,RJ,SP,MG',
            'street' => 'required|string|max:80',
            'suburb' => 'required|string|max:80',
            'apt_number' => 'string|numeric|required_if:house_number,null',
            'house_number' => 'string|numeric|required_if:apt_number,null',
         ];
    }
}

Como utilizar Form Request

Ok, ja criamos o nosso Form Request, mas ele não começa a validar nossas requests magicamente sem fazermos nada.

Precisamos incluir a instancia dessa classe no nosso controller, mais especificamente no nosso método store().

<?php

namespace App\Http\Controllers;

use App\Htpp\Requests;

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

    // Registra o usuario no banco de dados
    public function store(StoreUserRequest $request)
    {
        // Os valores dentro da request já estão validados nesse ponto
        $validated_with_role = array_merge($request->validated(), ['role' => 'user']);
        User::create($validated_with_role);
    }
}

Service Container do Laravel toma conta de instanciar a classe e nos retornar esse objeto que resolvi chamar de $request mas você pode chamar do jeito que você quiser.

Esse objeto inclui varias funções bem uteis. Mas à que estamos interessados agora é o método validated() esse método retorna um array como todos os valores que passaram na validação do nosso Form Request.

Desse ponto, você já tem seus dados validados, e só precisamos incluir o role ou qualquer outro campo necessário que não venha a partir do usuário.

Por fim, basta criar o novo usuário com o método User::create().

Deixe um comentário

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

0 Comments