Laravel 中模型的多个策略

Posted

技术标签:

【中文标题】Laravel 中模型的多个策略【英文标题】:Multiple Policies for a Model in Laravel 【发布时间】:2017-01-12 02:37:23 【问题描述】:

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();

等等。等等

【问题讨论】:

也许你可以扩展一个策略类来添加更多功能 【参考方案1】:

您可以使用特征来分隔策略的逻辑。

您将创建一个基类 TeamPolicy,然后使用基类中所需的各种方法创建多个特征。

<?php

class TeamPolicy

    use RoundPolicy, AnotherPolicy;

【讨论】:

【参考方案2】:

$policies 变量使用模型作为键和值作为策略。密钥是唯一的,因此您只能为每个模型设置一个策略。但是,您可以在多个模型上使用策略。

在您的情况下,App\Policies\AnotherPolicy 是唯一将使用的。同样为多个模型分配相同的策略实际上取决于您想要做什么。基本上你不想要乱七八糟的代码。因此,如果您为两个模型创建一个策略并且策略代码变得太大,那么是时候考虑创建另一个策略是否会使代码更简单/不那么粗糙。

【讨论】:

以上是关于Laravel 中模型的多个策略的主要内容,如果未能解决你的问题,请参考以下文章

在刀片视图文件中使用laravel策略授权

为多个模型创建一个策略?

Laravel:一次保存多个模型/ json嵌套输入

Laravel 关系 - 从多个模型中提取 ID

laravel策略类,实现当前登陆的用户是否具有删除,修改文章的权限

Laravel如何保存多个相关模型?