Laravel 9. Семь приемов настройки регистрации
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';
Важлива інформація
України
втрати противника
орієнтовно склали: