2017-01-12 6 views
2

Позволяет ли Laravel добавлять несколько политик для модели? То есть Рассмотрим App\Providers\ASuthServiceProvider «s $policies свойство:Несколько политик для модели - Laravel

protected $policies = [ 
    'App\Team' => 'App\Policies\TeamPolicy', 
    'App\Team' => 'App\Policies\RoundPolicy', 
    'App\Team' => 'App\Policies\AnotherPolicy', 
]; 

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

Альтернативы у меня есть очень грязная политика, содержащая политику в отношении несколько контроллеров, названной в ГорбатыйРегистр:

/** 
* Allows coach of Team and admin to see the Team management view. 
* Used in TeamManagementController 
* 
* @param App\User $user 
* @param App\Team $team 
* @return boolean 
*/ 
public function manage(User $user, Team $team) 
{ 
    return $user->id === $team->user_id || $user->isAdmin(); 
} 

/** 
* Allows a coach to detach themself from a Team. 
* Used in TeamController 
* 
* @param App\User $user 
* @param App\Team $team 
* @return boolean 
*/ 
public function detach(User $user, Team $team) 
{ 
    return $user->id === $team->user_id; 
} 

/** 
* Below function are used for controllers other than TeamController and TeamManagementController. 
* Reason: We need to authorize, based on a Team. Hence, using this Policy. 
*/ 

/** 
* Allows coach of Team, as well as admin to view players of a Team. 
* Used in PlayerController 
* 
* @param App\User $user 
* @param App\Team $team 
* @return boolean 
*/ 
public function indexPlayers(User $user, Team $team) 
{ 
    return $user->id === $team->user_id || $user->isAdmin(); 
} 

/** 
* Allows coach of Team, as well as admin to view players of a Team as an array. 
* Used in PlayerController 
* 
* @param App\User $user 
* @param App\Team $team 
* @return boolean 
*/ 
public function fetchPlayers(User $user, Team $team) 
{ 
    return $user->id === $team->user_id || $user->isAdmin(); 
} 

и т.д. и т.п.

советов будут оценены :)

+0

Возможно, вы можете просто расширить класс политики, чтобы добавить больше функциональности –

ответ

1

Переменная $policies использует модель как ключ и как значение политики. Ключи уникальны, поэтому вы можете устанавливать только одну политику для каждой модели. Однако вы можете использовать политику для нескольких моделей.

В вашем случае App\Policies\AnotherPolicy является единственным, который будет использоваться. Также назначая несколько моделей, одна и та же политика действительно зависит от того, что вы хотите сделать. В принципе, вам не нужен грязный или грубый код. Поэтому, если вы создаете политику для двух моделей и код политики становится слишком большим, настало время подумать над тем, может ли создание другой политики сделать код более простым/менее грубым.

Смежные вопросы