Laravel. Как грамотно реализовать регистрацию нескольких типов пользователей с абсолютно разными полями?

Все привет!

Работаю на порталом "поиска работы", что-то похожее на hh.ru. На данный момент я реализовал регистрацию/авторизацию с помощью полифорфных связей, приведу небольшой пример:
- сущность Пользователь (User) хранит поля только email и password, имеет связь
public function profile()
    {
        return $this->morphTo();
    }
это удобно тем что при авторизации достаточно иметь одну точку входа и система отдаст пользователя не зависимо от его типа;
- добавил две сущности Соискатель (Jobseeker) и Работодатель (Employer), имеют связь
public function user()
    {
        return $this->morphOne('App\User', 'profile');
    }


По началу мне показался данный подход приемлемым, но чем дальше в "лес", тем больше сложностней ...
Кода я пытаюсь достать пользователя мне приходится вызывать следующим образом
Auth::user()->profile
// Проверять пользователя 
Auth::user()->profile->isEmployer()
// Компания может обновить менеджера (рекрутера), 
// для этого в сущность Employer метод update() ломаю голову что лучше передавать id User и доставать снова 
$user = User::findOrFail($id); 
$user->profile()->update(...) 
//или id Employer и 
$employer->findOrFail($id); 
$employer->update(...)

//  и самое больное место это создание и обновление пользователя,
// для меня этот кусок кода смотрится ужасно 
// побочный эффект полиморфных связей
$employer = Employer::create([
   'phone' => $request->get('phone'),
   'full_name' => $request->get('full_name'),
    'company_id' => Auth::user()->profile->company_id
 ]);

$employer->user()->create([
   'email' => $request->get('email'),
   'password' => $request->get('password')
]);

Следом я нашел другую реализацию, с помощью добавления нового guard в конфиге auth, но при этом подходе как мне кадется придется дублировать контроллеры авторизации, регистрации и тд..

Буду признателен за дельный совет, спасибо!
  • Вопрос задан
  • 680 просмотров
Пригласить эксперта
Ответы на вопрос 1
Kulaxyz
@Kulaxyz
Могу лучше
Можно реализовать через роли например.
Объединив все поля в одну таблицу, указав nullable()->default(null)
И в коде просто проверять через Gate.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы