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

Раз в неделю мы отправляем дайджест с самыми популярными статьями. Подпишитесь на наши новости и мы сделаем для вас бесплатно аудит вашего сайта.