Регистрация по инвайтам в Laravel

Ромчик
2

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.

01Отлично, код сгенерирован и записан в базу. Теперь отредактируем контроллер 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>

Проверим. Попытаемся зарегистрироваться без кода или с неверным кодом.

02Теперь проверим с введенным верным кодом.

03

Все работает.

Мы с вами сделали регистрацию по инвайтам. В следующей статье мы изменим метод для регистрации пользователя по инвайтам: выведем проверку кода в отдельный валидатор, который создадим. Так, что не пропускайте выхода новых постов. Следите в Facebook, в Вконтакте, в Twiter и в Google+.

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

  • Создание собственного валидатора в Laravel | Все о WEB программировании - 21.10.2015 в 08:17

    […] времени суток. В статье «Регистрация по инвайтам в Laravel» мы создали регистрацию пользователей в Laravel по […]

  • Tytar - 19.11.2015 в 03:22

    Зачем писать велосипед-функцию generate если есть готовая хелпер функция str_random(/*число-длина строки*/) в самом ларавеле?

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

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