Проверка перед созданием пользователя в RegistrationController - PullRequest
0 голосов
/ 08 марта 2019

В этом сценарии Laravel, когда пользователь помещает свои данные для регистрации, Laravel сначала создает пользователя, а затем отправляет электронное письмо для проверки, я, наоборот, хочу это действие: я хочу после того, как пользователь вводит свои данные, Laravelотправляет подтверждение по электронной почте и, если проверка прошла успешно, создает пользователя.

Контроллер регистрации:

<?php

namespace App\Http\Controllers\Auth;

use App\GeneralSetting;
use App\Service;
use App\ServicePrice;
use App\User;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default, this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/

use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = 'user/dashboard';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
            'username' => 'required|string|alpha_dash|max:25|unique:users',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        $general = GeneralSetting::first();
        $code = str_random(6);
        if($general->email_verification == 1){
            $ev = 0;
            send_email($data['email'], $data['name'], 'Verification'
            ,'Your code is'.':' . $code);
        }else {
            $ev = 1;
        }
        $api = str_random(30);
         $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'username' => $data['username'],
            'password' => bcrypt($data['password']),
            'verification_time' => Carbon::now(),
            'verification_code' => $code,
            'email_verify' => $ev,
            'api_key' => $api,
        ]);
        $services = Service::all();
        foreach ($services as $service){
            $servicePrice = new ServicePrice();
            $servicePrice->category_id = $service->category_id;
            $servicePrice->service_id = $service->id;
            $servicePrice->user_id = $user->id;
            $servicePrice->price = $service->price_per_k;
            $servicePrice->save();
        }
        return $user;

    }
}

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

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

Вы можете оставить свой метод создания как есть.Внутри вашего RegisterController также есть функция register ().

1. В этой функции вы должны переопределить часть, где пользователь вошел в систему, и вместо этого вы должны перенаправить его на страницу ссообщение о том, что электронное письмо было отправлено, и он должен проверить его.

Теперь, как я вижу, вы отправляете код с электронным письмом.

2. В сообщении электронной почты также следует указать ссылку, которая перенаправляет пользователя на страницу отправки кода.

3. Если у вас нет такой страницы, вы должны создать ее.Blade-файл, функция для его просмотра и маршрут к файлу web.php для доступа к нему.

4. Внутри этой страницы у вас будет <form> с одним <input> поле, например, 'code', где его действие будет указывать на функцию, которую вы создадите, например validateCode () внутри вашего RegisterController.

Тогда это задание функций будет проверять таблицу Users на пользователя с таким же кодом.с помощью предоставленного в запросе, если такой пользователь существует, он обновит поле 'email_verify' до 1 входа в систему пользователя и перенаправит его на панель, если нет, он перенаправит обратно в представление отправки кода:

public function validateCode(Request $request)
{
    $user = User::whereVerificationCode($request->get('code'))->first();
    if($user){
        $user->verify_email = true;
        $user->update();
        Auth::login($user);
        return redirect()->route('home');
    }else{
        return redirect()->back();
    }    
}

Также было бы хорошо, если вы измените код, который вы генерируете, на 9 или 10 цифру или даже лучше на хеш-строку по соображениям безопасности.

0 голосов
/ 08 марта 2019

Когда пользователь регистрируется, информация, которую он предоставляет, сохраняется в таблице users, по крайней мере, вы устанавливаете свойство $table модели в другое значение.А факт сохранения информации о пользователях в таблицах является частью процесса регистрации пользователей.Это странный факт, что вы хотите зарегистрировать пользователя только после того, как он подтвердит свой адрес электронной почты.Мой совет Будет не регистрировать пользователя после его регистрации и перенаправлять его на другую страницу, даже если он попытается войти в систему, вы зададите условие входа в систему, чтобы регистрировать только пользователя, чей адрес электронной почты подтвержден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...