Web Analytics Made Easy - StatCounter
Главная Блог Несколько пользовательских моделей с Laravel Jetstream

Несколько пользовательских моделей с Laravel Jetstream

Несколько пользовательских моделей с Laravel Jetstream

Введение

Как использовать несколько пользовательских моделей с Laravel Jetstream с помощью родительского пакета Калеба Порцио. Когда я разрабатывал StackJobs, я хотел использовать Laravel Jetstream, а также несколько моделей User. Developer для разработчиков и Recruiter для рекрутеров.

Каждая из них будет иметь свои собственные отношения, а отношения из других моделей (например, Skill и Stack) будут ссылаться на эти конкретные модели, а не на общего User.

Это сложно, потому что Jetstream предполагает наличие единственной модели - User. (Или User и Team, если вы также используете команды.)

К счастью, Калеб Порцио создал для этого идеальный пакет: parental.

Внедрение

Миграции

Добавьте type строку в колонку к вашей таблице users. $table->string('type');

Модели

Затем создайте свои собственные модели и реализуйте через HasParent

class Developer extends User { use HasParent; // developer relations... } class Recruiter extends User { use HasParent; // recruiter relations... } 

Затем внесите изменения в вашу 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. Это означает, что мы можем делать такие приятные вещи, как:

<nav> @if(developer()) <div>Some item</div> <div>Some item</div> @elseif(recruiter()) <div>Some item</div> <div>Some item</div> @else ... @endif </nav> 

Вы также можете использовать помощники в своем коде, например:

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 \ CreateNewUser:

'type' => ['required', Rule::in(['developer', 'recruiter'])], 

Заключение

Вот и все. Parental автоматически вернет правильный класс из запросов auth () -> user (), и вы можете добавить отношения к своим конкретным пользовательским моделям.

Надеюсь, это будет полезно :)

Источник

Multiple user models with Laravel Jetstream