Back-End

18 jun, 2014

Formulário de contato com Laravel

Publicidade

Olá, pessoal! Hoje vou falar sobre como montar, de forma fácil, um formulário de contato em seu site usando o Laravel 4.1.

Em meu site, precisei colocar um formulário de contato para que as pessoas que acessam o site possam entrar em contato, seja para solicitar os serviços, ou para dar opinião, criticar… Enfim, ter uma forma de entrarem em contato comigo.

A princípio, tentei fazer o envio usando SMTP autenticado. Localmente, funcionou perfeitamente, mas quando enviei para meu servidor remoto, não funcionou (o Server bloqueou o envio por segurança. Ainda estou resolvendo isso). Mas no servidor remoto, consegui fazer o envio usando como tipo de envio a função mail() do PHP.

Para começar, criei duas rotas, uma para o método GET e outra para o método POST:

Route::get('contato', array('as' => 'contato', 'uses' =>'HomeController@contato'));
Route::post('contato', 'HomeController@postContato');

Agora, vamos criar a view responsável pelo formulário:

/app/views/pages/contato.blade.php
{{ Form::open(array('action' => 'HomeController@contato', 'role' => 'form')) }}
{{ Form::label('nome', 'Nome', array('class'=>'control-label')) }}
 {{ Form::text('nome', null, array('placeholder'=>'Seu nome...', 'class'=>'form-control')) }}
{{ Form::label('email', 'E-mail', array('class'=>'control-label')) }}
 {{ Form::text('email', null, array('placeholder'=>'Seu e-mail...', 'class'=>'form-control')) }}
{{ Form::submit('Enviar Mensagem', array('class' => 'btn btn-default')) }}{{ Form::close() }}

As classes de formatação que estou usando no exemplo são padrão do Twitter bootstrap, que uso com frequência pela facilidade de uso.

Em meu controller HomeController, criei dois métodos, um para carregar a view e outro para o método POST, para enviar o e-mail.

public function contato() {
 return View::make('pages.contato');
}
public function postContato() {
$rules = array( 'nome' => 'required', 'email' => 'required|email', 'texto' => 'required' );
$validation = Validator::make(Input::all(), $rules);
$data = array();
 $data['nome'] = Input::get("nome");
 $data['email'] = Input::get("email");
 $data['texto'] = Input::get("texto");
if($validation->passes()) {
 Mail::send('emails.contato', $data, function($message) {
 $message->from(Input::get('email'), Input::get('nome'));
 $message->to('contato@billjr.com.br') ->subject('Contato Bill Jr.');
 });
return Redirect::to('contato') ->with('message', 'Mensagem enviada com sucesso!');
 }
return Redirect::to('contato') 
 ->withInput() 
 ->withErrors($validation) 
 ->with('message', 'Erro! Preencha todos os campos corretamente.');
}

Explicarei agora o que fiz no método postContato():

  • Criei a variável $regras para validar meu formulário;
  • Criei a variável $validation validando meu formulário com o Validator::make(), e usando o Input::all() para trazer todos campos postados pelo formulário;
  • Usando a condição if, verifico se a validação “passou” (if($validation->passes()));
  • Na variável $data, criei um array vazio, depois atribuí o valor de cada campo postado pelo formulário, para facilitar;
  • A seguir, uso o método de envio de email padrão do Laravel, com Mail::send(), e passando os parâmetos from, to e subject.
    • Em $message->from, informo email e nome do contato
    • Em $message->to, informo meu email de contato
    • Em $message->subject, o assunto do meu email de contato

Dentro da validação (if($validation->passes)), uso o return Redirect::to() para redirecionar para a página de contato, caso o e-mail tenha sido enviado com sucesso, com uma mensagem de “Sucesso!”.

Após fechar o bloco de código da validação, coloco uma validação com a mensagem de erro, caso o e-mail não tenha sido enviado com sucesso. A mensagem de sucesso exibo dentro do meu arquivo de layout padrão do site, desta forma:

@if(Session::has('message'))
 {{ Session::get('message') }}
@endif

Bom, galera, é isso! Desta forma você pode ter facilmente um formulário de contato em seu site, ou adaptar o script para suas necessidades.

Caso queiram saber mais sobre como enviar e-mails com Laravel, acessem a documentação oficial em: e-mail com Laravel

Até o próximo artigo!