You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API Platform:如何为单个操作配置专属过滤器?

API Platform操作级别过滤器配置解决方案

错误原因

你之前的两种写法均因传入过滤器实例而非类名字符串报错:

  • 写法一传入new ApiFilter(...)实例,OpenApi生成器要求过滤器ID为字符串类型,触发类型不匹配错误;
  • 写法二直接实例化OrderFilter,同样不符合filters参数接受字符串的规则。

正确配置方式

方式1:类级别定义+操作级别选择启用/禁用

先在实体类上定义过滤器的全局配置,再在不同GetCollection操作中通过filters数组控制是否启用:

#[ApiResource(
    description: 'The Audits keep track of actions performed by users or the system.',
    operations: [
        // 启用OrderFilter的标准查询接口
        new GetCollection(
            security: "is_granted('ROLE_ADMIN')",
            securityMessage: 'Only admins can access all audits freely',
            filters: [OrderFilter::class] // 传入过滤器类名字符串
        ),
        // 不带过滤器的自定义控制器接口
        new GetCollection(
            name: 'custom_audit_collection',
            controller: CustomAuditController::class,
            filters: [] // 空数组表示禁用所有过滤器
        )
    ],
    normalizationContext: ['groups' => ['audit:full', 'base:full', 'user:basic']],
    denormalizationContext: ['groups' => ['audit:full', 'base:full', 'user:basic']],
)]
// 类级别配置OrderFilter,指定仅对第一个GetCollection操作生效
#[ApiFilter(OrderFilter::class, properties: ['type'], operations: ['get_collection'])]
class Audit {
    // 实体属性定义...
}

方式2:操作级别单独配置过滤器

如果需要给单个操作单独配置过滤器参数,可通过操作的extraAttributes或直接在操作上添加#[ApiFilter]注解:

#[ApiResource(
    description: 'The Audits keep track of actions performed by users or the system.',
    operations: [
        // 单独配置过滤器的标准查询接口
        new GetCollection(
            security: "is_granted('ROLE_ADMIN')",
            securityMessage: 'Only admins can access all audits freely',
            filters: [OrderFilter::class],
            extraAttributes: [
                'filters' => [
                    OrderFilter::class => ['properties' => ['type']]
                ]
            ]
        ),
        // 不带过滤器的自定义控制器接口
        new GetCollection(
            name: 'custom_audit_collection',
            controller: CustomAuditController::class,
            filters: []
        )
    ],
    normalizationContext: ['groups' => ['audit:full', 'base:full', 'user:basic']],
    denormalizationContext: ['groups' => ['audit:full', 'base:full', 'user:basic']],
)]
class Audit {
    // 实体属性定义...
}

或者直接在操作上添加注解(需API Platform版本支持操作级注解):

#[ApiResource(
    description: 'The Audits keep track of actions performed by users or the system.',
    operations: [
        #[ApiFilter(OrderFilter::class, properties: ['type'])]
        new GetCollection(
            security: "is_granted('ROLE_ADMIN')",
            securityMessage: 'Only admins can access all audits freely',
            filters: [OrderFilter::class]
        ),
        new GetCollection(
            name: 'custom_audit_collection',
            controller: CustomAuditController::class,
            filters: []
        )
    ],
    normalizationContext: ['groups' => ['audit:full', 'base:full', 'user:basic']],
    denormalizationContext: ['groups' => ['audit:full', 'base:full', 'user:basic']],
)]
class Audit {
    // 实体属性定义...
}

内容的提问来源于stack exchange,提问作者SchabrechtsK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:54