Слава Україні!

Laravel 9. Семь приемов настройки регистрации

Семь примеров для тонкой настройки регистрации в вашем приложении
15-го грудня 2022, 7:53

Laravel имеет отличную систему аутентификации "из коробки". С помощью всего нескольких команд вы можете получить готовые функции входа/регистрации. Но давайте погрузимся немного глубже и посмотрим, что мы можем дополнительно настроить.

1. Отключение регистрации

Это может понадобиться, например, в том случае, если приложение используется для работы внутри компании и доступ предоставляется администратором

В файле маршрутов приложения routes/web.php передаем параметр

Auth::routes(['register' => false]);

Тогда вы не увидите ссылку «Регистрация» в правом верхнем углу, а маршрут /register покажет страницу 404.

2. Проверка электронной почты

По умолчанию проверка отключена, но все необходимые поля и маршруты генерируются, просто скрыты. Чтобы включить эту функцию, просто передайте параметр в routes/web.php:

Auth::routes(['verify' => true]);

Кроме того, обязательно запустите команду php artisan make:auth, для генерации необходимых представлений.

Если вам нужны какие-то маршруты, доступные только проверенным пользователям, используйте следующий Middleware:


Route::get('profile', function () {
    // Только проверенные пользователи...
})->middleware('verified');

3. Отключение сброса пароля

По умолчанию команда php artisan make:auth создает страницы входа/регистрации, а также страницу для сброса забытого пароля. Чтобы отключить эту функцию, передайте параметр в routes/web.php:

Auth::routes(['reset' => false]);

Примечание: вы также можете комбинировать все вышесказанное. Например:


Auth::routes([
    'register' => false,
    'verify' => true,
    'reset' => false
]);

4. Перенаправление после регистрации

По умолчанию, после регистрации, пользователи перенаправляются на URL /home. Чтобы изменить адрес перенаправления в классе app/Http/Controllers/Auth/RegisterController меняем свойство $redirectTo:


class RegisterController extends Controller
{
    /**
    * Where to redirect users after registration.
    *
    * @var string
    */
    protected $redirectTo = '/after-register';
...

Также можно использовать несколько адресов, например, для перенаправления в зависимости от роли пользователя. Для этого переопределим метод redirectTo():


...
protected function redirectTo()
{
    if (auth()->user()->role_id == 1) {
        return '/admin';
    }
    return '/home';
}
...

5. Отключение автовхода после регистрации

Еще одно правило по умолчанию, которое можно изменить - отключить автологин после регистрации пользователя. Это пригодится например в том случае, если пользователь должен дополнительно подтвердить свой e-mail.

Итак, для отключения автологина нужно изменить метод register() в трайте RegistersUsers. Но так как напрямую править метод не комильфо, то просто скопируем этот метод из трайта RegistersUsers в RegisterController.

За автологин отвечает строка $this->guard()->login($user);. Ее надо удалить или закомментировать. В итоге метод будет выглядеть так:


namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;

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

class RegisterController extends Controller
{

    // ... Other methods

    /**
    * Handle a registration request for the application.
    *
    * @param  \Illuminate\Http\Request  $request
    * @return \Illuminate\Http\Response
    */
    public function register(Request $request)
    {
        $this->validator($request->all())->validate();

        event(new Registered($user = $this->create($request->all())));

        // $this->guard()->login($user);

        if ($response = $this->registered($request, $user)) {
            return $response;
        }

        return $request->wantsJson()
            ? new JsonResponse([], 201)
            : redirect($this->redirectPath());
    }

}

6. Дополнительные поля в форме регистрации

Довольно часто, при регистрации пользователя, необходимо получить дополнительную информацию. Например номер телефона. Это реализуется в четыре простых шага.

Шаг 1. Добавление поля в таблицу.

В файл миграции таблицы users добавляем строку: $table->string(‘phone’);. Либо можно создать новую миграцию командой: php artisan make:migration add_surname_to_users_table.

Шаг 2. Добавление поля в модель User.

В свойство fillable, которое является массивом, добавляем поле phone:


protected $fillable = [
    'name', 'email', 'password', 'phone',
];

Шаг 3. Добавление поля в форму регистрации.

Добавим в файл resources/views/auth/register.blade.php следующий код:


<div class="form-group row">
    <label for="phone" class="col-md-4 col-form-label text-md-right">{{ __('Phone') }}</label>

    <div class="col-md-6">
        <input id="phone" type="text" class="form-control{{ $errors->has('phone') ? ' is-invalid' : '' }}" name="phone" value="{{ old('phone') }}" required autofocus />

        @if ($errors->has('name'))
            <span class="invalid-feedback" role="alert">
            <strong>{{ $errors->first('phone') }}</strong>
        </span>
        @endif
    </div>
</div>

Шаг 4. Изменение методов.

Изменим методы validator() и create() в классе RegisterController:


/**
 * 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'],
        'phone' => ['required', 'string', 'max:31', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
}

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\Models\User
 */
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'phone' => $data['phone'],
        'password' => Hash::make($data['password']),
    ]);
}

7. Вход по полю Username

По умолчанию электронная почта является наиболее важным полем для пользователя. Оно используется как уникальный идентификатор и является частью учетных данных. Но что, если в вашем случае электронная почта — это просто информационное поле, а фактические учетные данные для входа — другое (напр. username).

Для начала, убедитесь, что это поле присутствует в таблице / модели / представлении, как обсуждалось в предыдущем совете.

Затем в классе app/Http/Controllers/Auth/LoginController переопределяем метод username() (сам метод находится в трайте AuthenticatesUsers):


class LoginController extends Controller
{
    use AuthenticatesUsers;
    // ... All other code

    /**
    * Get the login username to be used by the controller.
    *
    * @return string
    */
    public function username()
    {
        return 'email';
    }
    ...

Как видно из кода, это простая функция, возвращающая поле, по которому будет проверятся логин. Просто меняем его на нужное: return 'username';

Важлива інформація

Міністерство оборони
України
з 24.02 по 07.02
втрати противника
орієнтовно склали:
846650 ( +1340 ) особового складу
9975 ( +10 ) танків
20755 ( +18 ) бойових бронемашин
22785 ( +32 ) артилерійських систем
1271 ( +0 ) РСЗВ
1056 ( +1 ) засоби ППО
369 ( +0 ) літаків
331 ( +0 ) гелікоптерів
36307 ( +96 ) автомобільної техніки
28 ( +0 ) кораблі / катери
3054 ( +0 ) крилаті ракети
24301 ( +116 ) БПЛА
3738 ( +1 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
1 ( +0 ) підводні човни