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
相关产品推荐
相关产品推荐

