Laravel 中模型的多个策略
Multiple Policies for a Model in Laravel
Laravel 是否允许我们为模型添加多个策略? IE。考虑 App\Providers\ASuthServiceProvider
的 $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
是唯一将被使用的。此外,为多个模型分配相同的策略实际上取决于您想要做什么。基本上你不想要凌乱或粗糙的代码。因此,如果您为两个模型创建一个策略并且策略代码变得太大,那么是时候考虑创建另一个策略是否会使代码 simpler/less 变得粗糙。
您可以使用特征来分离策略的逻辑。
您将创建一个基础 TeamPolicy
,然后在基础 class.
中使用您想要的各种方法创建多个特征
<?php
class TeamPolicy
{
use RoundPolicy, AnotherPolicy;
}
Laravel 是否允许我们为模型添加多个策略? IE。考虑 App\Providers\ASuthServiceProvider
的 $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
是唯一将被使用的。此外,为多个模型分配相同的策略实际上取决于您想要做什么。基本上你不想要凌乱或粗糙的代码。因此,如果您为两个模型创建一个策略并且策略代码变得太大,那么是时候考虑创建另一个策略是否会使代码 simpler/less 变得粗糙。
您可以使用特征来分离策略的逻辑。
您将创建一个基础 TeamPolicy
,然后在基础 class.
<?php
class TeamPolicy
{
use RoundPolicy, AnotherPolicy;
}