Utilizando os Form Requests
04 Apr 2015Nesta versão, ~5.0
, o laravel veio com um recurso nativo para validação de dados recebidos via http (via formulário, ajax, etc) nesse artigo vou tratar as formas mais comuns de utilizá-los.
Form Request
O primeiro passo é termos um controller pra nosso recurso, então vamos supor que trabalhemos com o formulário contato:
php artisan make:controller ContatoController --plain
Deve criar um controller para nosso formulário de contato, vamos adicionar os seguintes métodos:
<?php namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ContatoController extends Controller {
/**
* Mostra o formulário de contato
*/
public function getIndex()
{
return view('contato.index');
}
/**
* Trata o formulário de contato e mostra os dados
*/
public function postIndex(Request $request)
{
$data = $request->all();
dd($data);
}
}
Feito isso, vamos criar também a view que conterá o formulário html do contato, arquivo resources/views/contato/index.blade.php
:
```html
@extends('app')
@section('content')
@endsection ``` Observe que estou mandando também o token da sessão através do campo oculto _token, ele serve para o laravel não bloquear nossa requisição (resumidamente). Você pode ler mais sobre ele em Laravel 5 - Token Mismatch Exception.
Vamos definir também as rotas de acesso ao nosso formulário:
php
//Arquivo: app/Http/routes.php
Route::controller("contato", "ContatoController");
Agora, se quisermos sabe quais foram as rotas criadas até o momento:
php artisan route:list
Ele deve mostrar que tem uma rota GET|HEAD contato
e POST contato
(que usaremos aqui), além das outras rotas já definidas. Se você notou, no nosso formulário eu já defini qual a rota que ele deve enviar os dados, no caso, POST contato
.
Nosso formulário inicial será esse aqui:
Se voce tentar utilizá-lo, já deve conseguir, ele deve mostrar uma saída dessa forma:
E se verificou bem, esse formuário não tem nenhuma validação, nada impede que o usuário envie a informação sem nome, ou com um e-mail inválido ou mesmo sem o corpo da mensagem do contato.
Criando o Form Request
php artisan make:request ContatoRequest
Por padrão, vai criar um FormRequest em app/Http/Requests/ContatoRequest.php
que bloqueia qualquer tentativa de envio, com o método authorize, se tivessemos alguma regra de autorizização (ex.: o usuário ser admin, ou ser de um grupo de usuário em específio para poder enviar esse tipo de requisição, aí seria um bom lugar para fazer essa regra) retornar true significa que o usuário pode fazer esse tipo de Request. Então, vamos modificá-lo com as seguintes alterações:
<?php namespace App\Http\Requests;
use App\Http\Requests\Request;
class ContatoRequest extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; //qualquer um pode usar esse tipo de Request
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|min:3|alpha', //obrigatório com pelomenos 3 caracteres alfabéticos
'email' => 'required|email',//obrigatório e deve ser um email
'message' => 'required|min:30'//obrigatório com pelo menos 30 caracteres
];
}
}
Feito isso, precisamos alterar o Request que utilizamos em nosso controller (ContatoController@postIndex) para esse novo request com nossa validação: ```php //arquivo: apapp/Http/Controllers/ContatoController.php //Obs.: Você deve adicionar "use App\Http\Requests\ContatoRequest;" acima da definição da classe
/** * Trata o formulário de contato e mostra os dados * @param ContatoRequest $request */ public function postIndex(ContatoRequest $request) { $data = $request->all();
dd($data);
}
Feito isso, qualquer tentativa de enviar os dados de forma errada para o laravel, ele vai redirecionar de volta para o formulário com os erros salvos na sessão, então vamos editar um pouco nossa view <code>contato.index</code> pra mostrar essas mensagens de erro:
```html
@unless($errors->isEmpty())
<ul>
@foreach($errors->getMessages() as $error)
<li></li>
@endforeach
</ul>
@endunless
Basicamente, o que essas linhas fazem é percorrer nossa bolsa de mensagens de erros (MessageBag
) e mostrar o primeiro erro ($error[0]
) de cada campo.
Agora, se tentarmos inserir qualquer informação que não seja válida, o nosso ContatoRequest automaticamente vai redirecionar o usuário de volta para esse formulário e essas mensagens serão exibidas:
Ajax
Sem nenhum ajuste no formulário, ele poderia ser preenchido via ajax (Veja como configurar o token para requisições Ajax), exemplo usando jQuery:
$.ajax("contato", {
type:"POST",
dataType:"json",
data: {
name:"John",
email:"EmailErrado",
message:"Mensagem"
},
success:function(data){
console.log(data);
}
error:function(data){
console.log(error);
}
});
//Omitindo o _token do formulário, veja como configurá-lo em http://blog.vluzrmos.com.br/laravel-5-ajax-token-mismatch-exception/
Os dados retornados pelo Laravel em caso de erros serão um objeto JSON que pode ser facilmente tratado:
{
"name":["The name must be at least 3 characters."],
"email":["The email must be a valid email address."],
"message":["The message must be at least 30 characters."]
}
Conclusão
Esse foi o tutorial base para aprendizado das Form Requests, voce pode ler mais informações em:
E também pode usar pacotes para facilitar a construção dos formuálários e tradução das mensagens de erro:
- i18n dos arquivos lang caouecs/laravel-lang
- Html e Form facades Illuminate/html