Регистрация по инвайтам в Laravel
Доброго времени суток. В данной статье мы опишем как реализовать регистрацию пользователей по инвайтам в Laravel. Мы будем использовать код предыдущих статей: «Регистрация, активация и авторизация в Laravel (часть 1)» и «Регистрация, активация и авторизация в Laravel (часть 2)». Наша задача состоит в том, чтобы сгенерировать код, а затем выслать пользователю приглашение с данным кодом. Пользователь при регистрации должен ввести регистрационные данные и высланный ему код. Если введенный код совпадает с кодом, который мы сгенерировали, то регистрация проходит. Приступим.
Первое, что мы сделаем это создадим таблицу с кодами, создадим модель для работы с данной таблицей и контроллер.
Создание таблицы c кодами.
Запускаем команду:
artisan make:migration create_invite_table --cretae=invite
Отредактируем файл миграции, который мы только, что создали:
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CretateInviteTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('invite', function (Blueprint $table) { $table->increments('id'); $table->string('invite',5); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('invite'); } }
Для создания таблицы запускаем команду:
artisan migrate
Следующим шагом создаем модель для работы с данной таблицей.
Создание модели
Для генерации модели выполним команду:
artisan make:model Invite
Отредактируем нашу модель Invite.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Invite extends Model { protected $table = 'invite'; protected $fillable = ['invite']; }
В свойстве $table указываем с какой таблицей мы работаем.
В свойстве $fillable указываем поля, которые разрешены для массового редактирования.
Теперь создадим контроллер.
Создание контроллера.
Для создания контроллера выполним команду:
artisan make:controller InviteController
Отлично, контроллер мы создали. Создадим метод generate, который будет генерировать код. Откроем наш контроллер InviteController и добавим метод generate:
public function generate() { $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, 5); $code = implode("", $code_array); return $code; }
Теперь создадим метод create, который создает код (вызывает метод generate) и записывает его в таблицу invite.
public function create() { Invite::create([ 'invite' => $this->generate(), ]); return 'Ok'; }
И не забываем добавить:
use App\Invite;
Теперь создаем роут для нашего метода create.
Создание роута.
Открываем файл роутов и редактируем его:
<?php /* |-------------------------------------------------------------------------- | Application Routes |-------------------------------------------------------------------------- | | Here is where you can register all of the routes for an application. | It's a breeze. Simply tell Laravel the URIs it should respond to | and give it the controller to call when that URI is requested. | */ Route::group( [ 'prefix' => LaravelLocalization::setLocale(), 'middleware' => [ 'localeSessionRedirect', 'localizationRedirect' ] ], function() { Route::get('/', function () { return view('welcome'); }); Route::get('auth/login', 'Auth\AuthController@getLogin'); Route::post('auth/login', 'Auth\AuthController@postLogin'); Route::get('auth/register', 'Auth\AuthController@getRegister'); Route::post('auth/register', 'Auth\AuthController@postRegister'); Route::get('auth/logout', 'Auth\AuthController@getLogout'); Route::get('auth/activate','Auth\AuthController@activate'); Route::get('generate/invite','InviteController@create'); } );
Проверим. Перейдем по ссылке http://lesson.loc/ru/generate/invite и проверим в базе таблицу invite.
Отлично, код сгенерирован и записан в базу. Теперь отредактируем контроллер AuthController.
Регистрация по инвайту.
Открываем контроллер AuthController. Нас интересует метод postRegister. Изменим:
public function postRegister(Request $request) { $invite = Invite::where('invite',$request->invite)->get(); if($invite->count() == 0){ return 'Ooops'; } $validator = $this->validator($request->all()); if ($validator->fails()) { $this->throwValidationException($request, $validator); } $user = $this->create($request->all()); //создаем код и записываем код $code = CodeController::generateCode(8); Code::create([ 'user_id' => $user->id, 'code' => $code, 'type' => 1, ]); //Генерируем ссылку и отправляем письмо на указанный адрес $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 отправлено письмо со ссылкой для активации аккаунта'; }
Отредактируем вид формы регистрации 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(App::getLocale().'/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="invite">Код</label> <input type="text" class="form-control" id="invite" placeholder="код" name='invite'> </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>
Проверим. Попытаемся зарегистрироваться без кода или с неверным кодом.
Теперь проверим с введенным верным кодом.
Все работает.
Мы с вами сделали регистрацию по инвайтам. В следующей статье мы изменим метод для регистрации пользователя по инвайтам: выведем проверку кода в отдельный валидатор, который создадим. Так, что не пропускайте выхода новых постов. Следите в Facebook, в Вконтакте, в Twiter и в Google+.
[…] времени суток. В статье «Регистрация по инвайтам в Laravel» мы создали регистрацию пользователей в Laravel по […]
Зачем писать велосипед-функцию generate если есть готовая хелпер функция str_random(/*число-длина строки*/) в самом ларавеле?