#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.