Регистрация, активация и авторизация в Laravel (часть 1)
Доброго времени суток. В данной статье мы на примере разберем регистрацию пользователя в 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 !!}
Все проверяем, что получилось. Переходим на страницу регистрации:
Давайте для начала проверим валидацию. Для этого введем разные пароли:
Отлично валидация сработала. Теперь давайте зарегистрируем нового пользователя:
Ну и в логах проверим письмо:
Отлично все работает. На этом первую часть статьи я заканчиваю. А в следующей мы создадим метод для активации пользователя, а также сделаем авторизацию.
[…] и авторизации в Laravel. Так в первой части мы рассмотрели регистрацию пользователей в Laravel. И при регистрации пользователю высылалось […]
[…] И рассмотрим пример используя предыдущие статьи: «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть […]
[…] данных мы будем использовать примеры из статей «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть […]
[…] в Laravel. Мы будем использовать код предыдущих статей: «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть […]
[…] мы рассмотрели регистрацию пользователей на сайте : «Регистрация, активация и авторизация в Laravel (часть 1)», «Регистрация, активация и авторизация в Laravel (часть […]
Что же вы господа комментарии мои удаляете?
Добрый день!
Не пойму почему у меня такая ошибка:
Call to undefined function App\Http\Controllers\Auth\throwValidationException()
$this->throwValidationException($request, $validator);