Несколько политик для модели в Laravel

Позволяет ли 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();
}

и т. д.

6

Решение

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

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

5

Другие решения

Вы можете использовать черты, чтобы отделить логику для вашей политики.

Вы бы создали базу TeamPolicy а затем несколько признаков с различными методами, которые вы хотели бы в базовом классе.

<?php

class TeamPolicy
{
use RoundPolicy, AnotherPolicy;
}
5

По вопросам рекламы [email protected]