Bienvenid@s a otro capítulo del Tutorial de Laravel 5, en esta ocasión vamos a programar el envío de correos de confirmación de cuenta para los usuarios que se quieran registrar a nuestra aplicación, nos basaremos en el formulario de registro del capítulo anterior.
Lo primero que haremos es configurar los datos de acceso a un servidor smtp como puede ser gmail, para ello necesitamos tener una cuenta de gmail.
Abrimos el archivo .env y modificamos las siguientes variables:
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=tuemail@gmail.com MAIL_PASSWORD=tupassword MAIL_ENCRYPTION=tls
Para lo siguiente vamos a la carpeta "config" y abrimos el archivo mail.php y modificamos las siguientes variables:
'host' => env('MAIL_HOST', 'smtp.gmail.com'),
'from' => ['address' => 'tuemail@gmail.com', 'name' => 'El nombre de la aplicación'],
Lo siguiente que haremos es importar la clase Mail en el controlador AuthController, más información sobre la clase Mail:
use Mail;
Y modificar el método postRegister para poder enviar el email de confirmación al usuario:
public function postRegister(Request $request){
$rules = [
'name' => 'required|min:3|max:16|regex:/^[a-záéíóúàèìòùäëïöüñ\s]+$/i',
'email' => 'required|email|max:255|unique:users,email',
'password' => 'required|min:6|max:18|confirmed',
];
$messages = [
'name.required' => 'El campo es requerido',
'name.min' => 'El mínimo de caracteres permitidos son 3',
'name.max' => 'El máximo de caracteres permitidos son 16',
'name.regex' => 'Sólo se aceptan letras',
'email.required' => 'El campo es requerido',
'email.email' => 'El formato de email es incorrecto',
'email.max' => 'El máximo de caracteres permitidos son 255',
'email.unique' => 'El email ya existe',
'password.required' => 'El campo es requerido',
'password.min' => 'El mínimo de caracteres permitidos son 6',
'password.max' => 'El máximo de caracteres permitidos son 18',
'password.confirmed' => 'Los passwords no coinciden',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()){
return redirect("auth/register")
->withErrors($validator)
->withInput();
}
else{
$user = new User;
$data['name'] = $user->name = $request->name;
$data['email'] = $user->email = $request->email;
$user->password = bcrypt($request->password);
$user->remember_token = str_random(100);
$data['confirm_token'] = $user->confirm_token = str_random(100);
$user->save();
Mail::send('mails.register', ['data' => $data], function($mail) use($data){
$mail->subject('Confirma tu cuenta');
$mail->to($data['email'], $data['name']);
});
return redirect("auth/register")
->with("message", "Hemos enviado un enlace de confirmación a su cuenta de correo electrónico");
}
}
A continuación crearemos la plantilla de email, para ello crearemos una carpeta llamada "mails" en la carpeta "views" y crearemos un archivo php con el siguiente nombre register.blade.php y le agregamos el siguiente código que contiene el enlace de confirmación:
<h1>Bienvenid@ {{$data['name']}}</h1>
<a href="{{url()}}/auth/confirm/email/{{$data['email']}}/confirm_token/{{$data['confirm_token']}}">Confirmar mi cuenta</a>
Como podéis ver en el enlace hemos creado la ruta que utilizaremos para confirmar la cuenta de usuario, pasando dos argumentos email y confirm_token, ahora crearemos esta ruta en el archivo routes.php:
Route::get('auth/confirm/email/{email}/confirm_token/{confirm_token}', 'Auth\AuthController@confirmRegister');
Como podéis ver esta ruta esta conectada al controlador AuthController y tiene una acción llamada confirmRegister, esta acción será la encargada de verificar o no la cuenta del usuario, así que creamos esta nueva acción en el controlador AuthController:
public function confirmRegister($email, $confirm_token){
$user = new User;
$the_user = $user->select()->where('email', '=', $email)
->where('confirm_token', '=', $confirm_token)->get();
if (count($the_user) > 0){
$active = 1;
$confirm_token = str_random(100);
$user->where('email', '=', $email)
->update(['active' => $active, 'confirm_token' => $confirm_token]);
return redirect('auth/register')
->with('message', 'Enhorabuena ' . $the_user[0]['name'] . ' ya puede iniciar sesión');
}
else
{
return redirect('');
}
}
En esta acción lo primero que hacemos es una consulta select en la tabla users para comprobar si hay un usuario con el email y confirm_token pasados como argumentos en la ruta, de ser así se actualiza la columna active = 1 indicando que este usuario ha confirmado su cuenta, también se modifica el confirm_token del usuario y se redirecciona al formulario de registro con un mensaje flash.
Una vez que el usuario ha confirmado su cuenta, podéis ver como se actualizar el confirm_token, de este modo el enlace queda inhabilitado para confirmar a un nuevo usuario, de hecho si el usuario ya ha confirmado su cuenta y vuelve a hacer click en el enlace será redireccionado a la página de inicio.

No hay comentarios:
Publicar un comentario