Laravel,有自定义控制器方法和自定义策略方法吗?

Laravel, having a custom controller method with custom policy method?

我有一个资源控制器,想为 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
       
    }
}

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

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

此外,如果您不return您的deleteMany策略方法中的任何内容,它将导致 403。

如果您的 route/controller 方法没有收到模型的实例,那么您还需要更新 return 从 resourceMethodsWithoutModels 方法编辑的数组:

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