Любой шаблон для многопользовательского типа?

#php #laravel

#php #laravel

Вопрос:

У меня есть система с разными типами пользователей:

СуперАдмин, Федерацияпрезидент, Ассоциацияпрезидент, КлубПрезидент, simpleUser.

Отношения:

Федерация имеет множество ассоциаций

Ассоциация имеет множество клубов

В клубе много пользователей

Я использую Laravel, поэтому я определил политики для управления тем, к чему пользователь может и не может получить доступ.

Но тогда FederationUser может использовать CRUD для всех пользователей в своей федерации, в то время как clubPresident может использовать CRUD только для пользователей из своего клуба.

В итоге я получаю такой код:

Association.php ( Модель )

 public static function fillSelect()
{
    $associations = new Collection();
    if (Auth::user()->isSuperAdmin()) {
        $associations = Association::pluck('name', 'id')->prepend('-', 0);
    } else if (Auth::user()->isFederationPresident()) {
        $associations = Auth::user()->federationOwned->associations->pluck('name', 'id')->prepend('-', 0);
    } else if (Auth::user()->isAssociationPresident()) {
        $association = Auth::user()->associationOwned;
        $associations->push($association);
        $associations = $associations->pluck('name', 'id')->prepend('-', 0);
    } else if (Auth::user()->isClubPresident()) {
        $association = Auth::user()->clubOwned->association;
        $associations->push($association);
        $associations = $associations->pluck('name', 'id')->prepend('-', 0);
    }
    return $associations;
}
  

Club.php

 public static function fillSelect()
{
    $clubs = new Collection();
    if (Auth::user()->isSuperAdmin()) {
        $clubs = Club::pluck('name', 'id');
    } else if (Auth::user()->isFederationPresident() amp;amp; Auth::user()->federationOwned != null) {
        $clubs = Auth::user()->federationOwned->clubs;
    } else if (Auth::user()->isAssociationPresident() amp;amp; Auth::user()->associationOwned != null) {
        $clubs = Auth::user()->associationOwned->clubs->pluck('name', 'id');
    } else if (Auth::user()->isClubPresident() amp;amp; Auth::user()->clubOwned != null) {
        $clubs = Auth::user()->clubOwned->pluck('name', 'id');
    }
    return $clubs;
}
  

Я чувствую, что это не так хорошо, так как для каждой модели мне приходится создавать множество if() .

Есть ли способ улучшить такие вещи?

Комментарии:

1. Может быть github.com/Zizaco/entrust могу вам помочь.

2. Я уже использую разрешение с политиками, и мне действительно не нужны роли. Кроме того, мне не очень нравится создавать такую большую зависимость от стороннего плагина. В прошлом я использовал другой подобный плагин (Sentinel), и когда был выпущен Laravel 5.2, мне пришлось ждать около 2 месяцев, пока они обновят свой компонент, чтобы я смог обновиться до L5.2…

3. Я бы сказал, что «суперпользователь» или «associationPresident» — это роль. Если вы не хотите использовать сторонний плагин, вы, вероятно, можете рассматривать их как роли и разрабатывать собственное промежуточное программное обеспечение, которое может действовать как фильтры для маршрутов. Не уверен, что это лучший способ сделать это, но он выводит бизнес-логику за пределы ORM.