jueves, 19 de noviembre de 2015

8 - Tutorial de Laravel 5 - Artisan migrate y User Register




En este capítulo del Tutorial de Laravel 5 empezaremos a crear un sistema de usuario, concretamente nos centraremos en la fase de registro de usuarios.

Antes de empezar necesitamos realizar algunas configuraciones, lo primero que haremos es crear una base de datos mysql llamada "laravel" con el cotejamiento "utf8_unicode_ci".

Lo siguiente es incluir los datos de acceso a la base de datos en el archivo ".env" ...

DB_HOST=localhost
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=password


A continuación haremos uso de la herramienta "artisan" para generar una migración de tablas, laravel para el sistema de usuarios nos ofrece dos tablas por defecto xxx_create_users_table.php y xxx_create_passwords_reset_table.php.

Estos archivos se encuentran en la carpeta "database\migrations", nosotros concretamente editaremos el archivo "xxx_create_users_table.php" para agregar dos columnas nuevas para controlar la confirmación de usuarios mediante email, el código con las dos nuevas columnas queda de la siguiente forma:

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->boolean('active')->default(0);
            $table->string('confirm_token', 100);
            $table->rememberToken();
            $table->timestamps();
        });
    }


Si os encontráis en la versión 5.0 de Laravel os encontraréis en la carpeta views una carpeta llamada "auth" con 4 vistas, entre ellas se encuentra register.blade.php. En el caso de la versión 5.1 esta carpeta no existe, así que de ser este el caso, crearemos en views la carpeta auth y agregaremos un nuevo archivo php llamado register.blade.php con el siguiente código:

@extends('layouts.home')

@section('content')

<h1>Formulario de registro</h1>

<div class="text-info">
    @if(Session::has('message'))
        {{Session::get('message')}}
    @endif
</div>

<form method="POST" action="{{url('auth/register')}}">
    {!! csrf_field() !!}

    <div class='form-group'>
        <label for="name">Nombre:</label>
        <input type="text" name="name" class="form-control" value="{{ old('name') }}" />
        <div class="text-danger">{{$errors->first('name')}}</div>
    </div>

    <div class="form-group">
        <label for="email">Email:</label>
        <input type="email" name="email" class="form-control" value="{{ old('email') }}" />
        <div class="text-danger">{{$errors->first('email')}}</div>
    </div>

    <div class="form-group">
        <label for="password">Password:</label>
        <input type="password" class="form-control" name="password" />
        <div class="text-danger">{{$errors->first('password')}}</div>
    </div>

    <div class="form-group">
        <label for="password_confirmation">Confirmar Password:</label>
        <input type="password" class="form-control" name="password_confirmation" />
    </div>

    <div>
        <button type="submit" class="btn btn-primary">Registrarme</button>
    </div>
</form>
@stop


Lo siguiente es trabajar con el modelo que nos ofrece Laravel para crear un sistema de usuarios, en la carpeta "app" encontraréis un archivo llamado User.php, este modelo está conectado al driver eloquent y nos permitirá trabajar con la tabla "users" para realizar consultas.

Para el inicio de sesión y el registro de usuarios Laravel nos ofrece un controlador llamado AuthController.php este lo podéis encontrar en la siguiente carpeta: app\Http\Controllers\Auth

Este controlador tiene una serie de métodos y acciones predefinidos de la clase AuthenticatesAndRegistersUsers

Para controlar la petición del formulario de registro utilizaremos la acción postRegister(Request $request), El código del controlador AuthController.php es el siguiente:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Http\Request;

class AuthController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Registration & Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users, as well as the
    | authentication of existing users. By default, this controller uses
    | a simple trait to add these behaviors. Why don't you explore it?
    |
    */

    use AuthenticatesAndRegistersUsers;

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest', ['except' => 'getLogout']);
    }

    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;
            $user->name = $request->name;
            $user->email = $request->email;
            $user->password = bcrypt($request->password);
            $user->remember_token = str_random(100);
            $user->confirm_token = str_random(100);
            $user->save();
            
            return redirect("auth/register")
            ->with("message", "Hemos enviado un enlace de confirmación a su cuenta de correo electrónico");
        }
            
        
    }
}



Para poder trabajar con el formulario de registro vamos a crear las rutas para conectar a las acciones getRegister y postRegister del controlador AuthController, en routes.php agregar al final las rutas:

Route::get('auth/register', 'Auth\AuthController@getRegister');
Route::post('auth/register', 'Auth\AuthController@postRegister');


Finalmente, nos dirigimos a la nueva ruta http://localhost/tutorial-laravel/public/auth/register para hacer la prueba de registro de usuarios, si no introducimos los datos correctamente veremos como se muestran los mensajes de error ya configurados en la acción postRegister, si los datos son correctos, un nuevo registro será agregado a la tabla users. 




2 comentarios:

Oasis dijo...

Hola, con la version 5.2, en la tabla users el nombre de la columna confirm_token ahora cambio a config_token.

Saludos.

Unknown dijo...

Me salta el siguiente error, si me puedes ayudar sería de mucha ayuda.
SQLSTATE[HY000] [1045] Access denied for user 'root@localhost'@'localhost' (using password: YES)