【问题标题】:Laravel, having a custom controller method with custom policy method?Laravel,有一个带有自定义策略方法的自定义控制器方法吗?
【发布时间】:2021-06-07 01:46:43
【问题描述】:

我有一个资源控制器,想为 destroyMany 添加一个额外的自定义策略方法 在删除许多之前,我会在其中检查用户是否是管理员。

默认方法可以正常工作

Controller Method Policy Method
index viewAny
show view
create create
store create
edit update
update update
destroy delete
destroyMany destroyMany

控制器destroyMany方法被调用,策略不是 还是我应该坚持使用盖茨这种额外的方法? 文档说我可以为方法和策略起任何名称,如何将两者联系起来?

destroyMany->destroyMany 或 destroyMany->deleteMany 将是一个不错的设置。

并且将是我的资源控制器(它应该驻留的位置)的一个很好的补充

class ResourceController extends Controller
{
    public function __construct()
    {
      $this->middleware('auth:api');
      $this->authorizeResource(Resource::class, 'resource');
    }

    public function index()
    {

        return ResourceCollection::collection(Resource::all());
    }

    public function destroyMany(Request $request)
    {
        // gets called but needs a policy which isn't called
    }
}

政策

class ResourcePolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    public function viewAny(User $user)
    {
        // works
        return $user->hasAnyRoles(['admin', 'superAdmin']);
    }

    public function delete(User $user, Resource $resource)
    {
       // works
        return $user->hasAnyRoles(['admin', 'superAdmin']);
    }

    public function deleteMany(User $user, Resource $resource)
    {
        // not called because the controller method needs to be hooked up, like the other methods
       
    }
}

【问题讨论】:

  • 你使用的是什么版本的 Laravel?请你也显示你的控制器代码。
  • 我已经编辑了我的问题,这是一个带有策略的普通资源控制器。 Laravel 8

标签: laravel controller resources policies


【解决方案1】:

要使添加策略方法起作用,您需要更新控制器的resourceAbilityMap。将以下内容添加到您的控制器应该可以解决问题:

protected function resourceAbilityMap()
{
    return array_merge(parent::resourceAbilityMap(), [
        'destroyMany' => 'deleteMany'
    ]);
} 

此外,如果您没有从您的 deleteMany 策略方法返回任何内容,则会导致 403。

如果您的路由/控制器方法没有收到模型的实例,那么您还需要更新从 resourceMethodsWithoutModels 方法返回的数组:

protected function resourceMethodsWithoutModels()
{
    return array_merge(parent::resourceMethodsWithoutModels(), ['destroyMany']);
}

【讨论】:

  • 很好的答案!尽管通过 resourceAbilityMap 添加并返回了 'destroyMany' => 'deleteMany' 我仍然得到 403,但我编辑了代码示例并添加了有效的删除方法。 deleteMany 具有相同的结构。
  • @user14409370 如果您不从策略方法返回任何内容,您将得到 403,因为不返回任何内容将导致错误值。对不起,我应该提到的。
  • @user14409370 抱歉,我没有想到您不会将Resource 的实例传递给路由/控制器。我已经更新了答案,表明您还需要将 resourceMethodsWithoutModels 方法添加到您的控制器中。
  • 太棒了! resourceMethodsWithoutModels 成功了!我非常感谢您的帮助,您展示了深厚的知识!希望你能得到足够的奖励积分。 ;-)
  • @user14409370 很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多