Регистрация, активация и авторизация в Laravel (часть 1)

Ромчик
8

laravelДоброго времени суток. В данной статье мы на примере разберем регистрацию пользователя в Laravel. Затем активацию пользователя, путем подтверждения его email адреса. Ну и напоследок, авторизацию пользователя в Laravel. Но авторизация должна проходить только активных пользователей.

Первое, что мы сделаем это создадим контроллер и вид для регистрации.

Создание формы регистрации

Переходим в директорию с шаблонами resources и в ней создаем поддиректорию auth. Теперь в папке auth создадим файл register.blade.php со следующим кодом:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Регистрация</title>
    <link href="{{ asset('/css/bootstrap.css') }}" rel="stylesheet">
    <script src="{{ asset('/js/jquery.js') }}" type="text/javascript" charset="utf-8"></script>
    <script src="{{asset('/js/bootstrap.js') }}" type="text/javascript" charset="utf-8"></script>
</head>
<body>
    <div class="container">
        <nav class="navbar" role="navigation">
            <ul class="nav navbar-nav">
                <li class="active">
                    <a href="{{ url('auth/login') }}">Вход</a>
                </li>;
            </ul>
        </nav>
        {{--Ошибки--}}
        @if ($errors->has())
          <div class="row">
              <div class="col-md-8 col-md-offset-2">
                  <div class="alert alert-danger" role="alert">
                      <button class="close" aria-label="Close" data-dismiss="alert" type="button">
                          <span aria-hidden="true">×</span>
                      </button>
                      <ul>                         
                          @foreach($errors->all() as $error)                         
                              <li> {{{ $error }}}</li>                         
                          @endforeach    
                      </ul>
                  </div>
              </div>
          </div>
      @endif
      <form role="form" method="post" action="{{ url('auth/register') }}">
          {!! csrf_field() !!}
          <div class="form-group">
            <label for="email">Email</label>
            <input type="email" class="form-control" id="email" placeholder="Email" name='email'>
          </div>
          <div class="form-group">
            <label for="password">Пароль</label>
            <input type="password" class="form-control" id="password" placeholder="Пароль" name="password">
          </div>
          <div class="form-group">
            <label for="confirm_password">Повторите пароль</label>
            <input type="password" class="form-control" id="confirm_password" placeholder="Повторите пароль" name="password_confirmation">
          </div>
          <button type="submit" class="btn btn-default">Отправить</button>
        </form>
    </div>
</body>
</html>

Я не буду объяснять код выше, тут и так все понятно.

Создавать контроллер для авторизации и регистрации ненужно. В Laravel уже есть механизм отвечающий за регистрацию и авторизацию. Контроллер:

    app/Http/Controllers/Auth/AuthController.php

Мы будем только переопределять методы контроллера AuthController.php. Так для отображения формы регистрации существует метод getRegister. Этот метод мы не трогаем.

Теперь перейдем к роутам. Открываем файл:

    app/Http/Controllers/routes.php

И определим роут к нашему методу:

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

Теперь откроем в браузере наше приложение. Отлично, видим форму для регистрации.

Регистрация пользователя в Laravel

Давайте сразу определим роут для регистрации пользователя. Перейдем в файл:

    app/Http/Controllers/routes.php

И добавим следующий роут:

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

Теперь создадим таблицу для хранения пользователей. Миграция для этой таблицы уже есть, но она нам не подходит. Изменим ее. Переходим в файл:

    database/migrations/2014_10_12_create_users_table.php

И изменим код:

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable
extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {       
        Schema::create('users', function (Blueprint $table) {          
            $table->increments('id');          
            $table->string('email')->unique();           
            $table->string('password', 60);           
            $table->boolean('activated')->default(0);          
            $table->rememberToken();           
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {       
        Schema::drop('users');
    }
}

Отлично, теперь создадим таблицу, где мы будем хранить коды для активации пользователей.

Создаем миграцию:

    artisan make:migration create_codes_table --create=codes

И вставим в нее следующий код:

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCodesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {       
       Schema::create('codes', function (Blueprint $table) {           
           $table->increments('id');
           $table->tinyInteger('user_id')->unsigned();           
           $table->string('code',10);           
           $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {      
        Schema::drop('codes');
    }
}

В данном коде нечего объяснять. Более подробно по миграциям вы можете почитать в официальной документации ( http://laravel.com/docs/5.1/migrations )

Следующим шагом создание модели для таблицы «codes». Выполняем команду:

artisan make:model Code

Сгенерировался файл Code.php следующего содержания:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Code extends Model
{
    //
}

Отредактируем его.

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Code extends Model
{
    protected $table = 'codes';
    protected $fillable = ['user_id', 'code'];
}

Создадим контроллер CodeController в котором опишем метод генерации кода.

artisan make:controller CodeController --plain

Сгенерирован файл контроллера со следующим содержанием:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class CodeController extends Controller
{
    //
}

Добавим в него метод генерации кода:

public static function generateCode($length = 10)
{
    $num = range(0, 9);	   
    $alf = range('a', 'z');	   
    $_alf = range('A', 'Z');   
    $symbols = array_merge($num, $alf, $_alf);   
    shuffle($symbols);	   
    $code_array = array_slice($symbols, 0, (int)$length);  
    $code = implode("", $code_array);
   
    return $code;
}

Дальше перейдем к контроллеру AuthController. Первое, что необходимо это изменить метод валидации:

protected function validator(array $data)
{
    return Validator::make($data, [
        'email' => 'required|email|max:255|unique:users',
        'password' => 'required|confirmed|min:6',
    ]);
}

Хорошо, дальше метод регистрации postRegister, который определен из коробки нам не подходит, поэтому давайте его переопределим. Открываем контроллер AuthController и добавляем следующий код:

public function postRegister(Request $request)
{
    $validator = $this->validator($request->all());
    if ($validator->fails()) {          
        throwValidationException($request, $validator);
    };
    $user = $this->create($request->all());
    //создаем код и записываем код
    $code = CodeController::generateCode(8);
    Code::create([
        'user_id' => $user->id,
        'code' => $code,
    ]);
    //Генерируем ссылку и отправляем письмо на указанный адрес
    $url = url('/').'/auth/activate?id='.$user->id.'&code='.$code;      
    Mail::send('emails.registration', array('url' => $url), function($message) use ($request)
    {          
        $message->to($request->email)->subject('Registration');
    });
    
    return 'Регистрация прошла успешно, на Ваш email отправлено письмо со ссылкой для активации аккаунта';
}

И не забываем в начале файла указать:

use App\Code;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\CodeController;

Небольшое отступление. Т.к. мы не подключили никаких сервисов для отправки email, то при отправке сообщения у нас будет вываливаться ошибка. Поэтому давайте настроим симуляцию отправки сообщения, а само сообщение будем записывать в лог. Тем более, что это в Laravel делается очень просто. Переходим в файл .env и меняем:

    MAIL_DRIVER=log;

Осталось создать шаблон для письма с кодом. Создаем папку emails в папке resources. И в папке emails создаем файл registration.blade.php следующего содержания:

Для активации аккаунта перейдите по ссылке: {!! $url !!}

Все проверяем, что получилось. Переходим на страницу регистрации:

01

Давайте для начала проверим валидацию. Для этого введем разные пароли:

02

Отлично валидация сработала. Теперь давайте зарегистрируем нового пользователя:

03

Ну и в логах проверим письмо:

04

Отлично все работает. На этом первую часть статьи я заканчиваю. А в следующей мы создадим метод для активации пользователя, а также сделаем авторизацию.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

  • Регистрация, активация и авторизация в Laravel (часть 2) | Все о WEB программировании - 07.10.2015 в 10:03

    […] и авторизации в Laravel. Так в первой части мы рассмотрели регистрацию пользователей в Laravel. И при регистрации пользователю высылалось […]

  • Создание artisan команды в Laravel | Все о WEB программировании - 12.10.2015 в 08:15

    […] И рассмотрим пример используя предыдущие статьи: «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть […]

  • Локализация приложения Laravel | Все о WEB программировании - 14.10.2015 в 09:45

    […] данных мы будем использовать примеры из статей «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть […]

  • Регистрация по инвайтам в Laravel | Все о WEB программировании - 19.10.2015 в 09:12

    […] в Laravel. Мы будем использовать код предыдущих статей: «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть […]

  • Используем капчу в Laravel | Все о WEB программировании - 11.11.2015 в 19:04

    […] мы рассмотрели регистрацию пользователей на сайте : «Регистрация, активация и авторизация в Laravel (часть 1)», «Регистрация, активация и авторизация в Laravel (часть […]

  • Tytar - 19.11.2015 в 07:50

    Что же вы господа комментарии мои удаляете?

  • Yurik - 21.11.2015 в 11:27

    Добрый день!
    Не пойму почему у меня такая ошибка:
    Call to undefined function App\Http\Controllers\Auth\throwValidationException()

    • rabzy - 30.05.2016 в 20:44

      $this->throwValidationException($request, $validator);

  • ©2012-2020 По всем вопросам обращайтесь через форму обратной связиПолитика конфиденциальности

    Яндекс.Метрика