Когда я создавал свой новый проект, то начал с установки каркаса аутентификации Laravel Jetstream. Но мне нужно было несколько моделей пользователей: Developer
— для разработчиков, и Recruiter
— для рекрутеров. Причем каждая из моделей должна иметь свои собственные отношения, а отношения из других моделей (например, Skill
и Stack
) должны ссылаться на эти конкретные модели, а не на общую модель User
. А Jetstream предполагает существование всего одной пользовательской модели — User
. Что же делать?
Но, к моему счастью, Калеб Порцио создал для этого отличный пакет: Parental. Давайте разберём, что он умеет и как им пользоваться.
Миграции
Добавьте в таблицу type
строковое поле users
.
$table->string('type');
Модели
Создайте нужные вам модели и примените к ним трейт HasParent
:
class Developer extends User { use HasParent; // developer отношения... } class Recruiter extends User { use HasParent; // recruiter отношения... }
Затем внесите следующие изменения в модель User
:
class User extends Authenticable { use HasChildren; protected $childTypes = [ 'developer' => Developer::class, 'recruiter' => Recruiter::class, ]; public function isDeveloper(): bool { return $this->type === 'developer'; } public function isRecruiter(): bool { return $this->type === 'recruiter'; } }
Трейты добавляют поддержку parental
и хелперы для таких проверок как auth()->user()->isDeveloper()
.
Хелперы
Вы также можете создать глобальный хелпер. Лично я сделал метод developer()
для получения текущего разработчика. И такой же для рекрутера — recruiter()
. Если текущий пользователь не является разработчиком, то developer()
вернет null
. Это означает, что мы можем делать такие вещи, как:
Вы также можете использовать хелперы в своем коде:
abort_unless(recruiter(), 403);
Чтобы добавить эти хелперы, создайте файл src/helpers.php
:
function developer(): ?Developer { $user = auth()->user(); if ($user instanceof Developer) { return $user; } return null; } function recruiter(): ?Recruiter { $user = auth()->user(); if ($user instanceof Recruiter) { return $user; } return null; }
И добавьте путь к нему в раздел autoload.files
файла composer.json
.
"autoload": { "psr-4": {...}, "files": [ "src/helpers.php" ], }
Регистрация
Возможно вы также захотите кастомизировать страницу регистрации. Например принимать пользовательский тип в <select>
и создавать команду только в том случае, если пользователь относится к определенному типу. В этом случае вы должны провести валидацию значения и сохранить его через класс App\Actions\Fortify\CreateNewUse
r:
'type' => ['required', Rule::in(['developer', 'recruiter'])],
Заключение
Вот и все. Parental автоматически, при вызове auth()->user()
, возвращает правильный класс, и вы можете добавлять отношения к вашим конкретным пользовательским моделям.
Автор: Samuel Štancl
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.