Позволяет ли Laravel добавлять несколько политик для модели? То есть рассматривать App\Providers\ASuthServiceProvider
«s $policies
имущество:
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();
}
и т. д.
$policies
переменная использует модель в качестве ключа и в качестве значения политики. Ключи уникальны, поэтому вы можете установить только одну политику для каждой модели. Однако вы можете использовать политику для нескольких моделей.
В вашем случае App\Policies\AnotherPolicy
это единственный, который будет использоваться. Кроме того, при назначении нескольких моделей одна и та же политика действительно зависит от того, что вы хотите сделать. В основном вы не хотите грязного или грубого кода. Поэтому, если вы создаете политику для двух моделей, а код политики становится слишком большим, пришло время подумать, не сделает ли создание другой политики код более простым / менее грубым.
Вы можете использовать черты, чтобы отделить логику для вашей политики.
Вы бы создали базу TeamPolicy
а затем несколько признаков с различными методами, которые вы хотели бы в базовом классе.
<?php
class TeamPolicy
{
use RoundPolicy, AnotherPolicy;
}