0

0

API Platform 自定义操作中禁用读取监听器的正确配置方法

霞舞

霞舞

发布时间:2026-01-19 20:09:19

|

715人浏览过

|

来源于php中文网

原创

API Platform 自定义操作中禁用读取监听器的正确配置方法

在 api platform 中为自定义操作(如 `/cards/random`)禁用默认 `readlistener` 时,必须将该操作声明在内置 `get` 操作之前,否则框架仍会尝试执行读取逻辑并返回 404 错误。

API Platform 的 ReadListener 会在请求生命周期中根据操作类型自动触发读取逻辑(例如通过 ID 加载实体)。当你定义一个非标准的 itemOperation(如 random),即使显式设置了 "read" => false,如果该操作位于内置 'get' 之后,API Platform 仍可能因路由匹配或操作解析顺序问题,错误地将其识别为需执行读取的 item 操作,从而调用 ReadListener 并因无法解析 {id} 而抛出 Not Found(404)。

根本原因在于:API Platform 对 itemOperations 的处理存在隐式优先级——当路径形如 /cards/random 且未包含 {id} 占位符时,若 random 操作排在 'get' 之后,框架可能跳过对该自定义操作的精确匹配,转而尝试按 get 的规则(要求 id 参数)进行解析,最终失败。

✅ 正确做法是:将自定义操作声明在所有依赖 ID 的内置操作(如 'get', 'put', 'delete')之前,确保其路由和配置被优先识别:

无涯·问知
无涯·问知

无涯·问知,是一款基于星环大模型底座,结合个人知识库、企业知识库、法律法规、财经等多种知识源的企业级垂直领域问答产品

下载
#[ApiResource(
    itemOperations: [
        // ✅ 自定义操作必须置于 'get' 之前
        'random' => [
            'method' => 'GET',
            'path' => '/cards/random',
            'controller' => CardRandomController::class,
            'read' => false, // 明确禁用 ReadListener
            'openapi_context' => [
                'summary' => 'Get a random card',
                'parameters' => [], // 注意:此处不应声明 "id" 参数,因路径无 {id}
            ],
        ],
        'get',      // ⚠️ 必须放在 custom operation 之后
        'put',
        'patch',
        'delete',
    ],
    denormalizationContext: ['groups' => 'card:write'],
    normalizationContext: ['groups' => 'card:read'],
)]
class Card
{
    // ...
}

⚠️ 同时注意以下关键细节:

  • openapi_context['parameters'] 中不应包含 "id" 字段(除非路径含 {id}),否则 OpenAPI 文档会错误提示必需参数;
  • 清除缓存(bin/console cache:clear)是必要步骤,但顺序问题无法通过清缓存解决
  • 控制器返回值需与 normalizationContext 兼容(本例中 Card 实体需支持 card:read 序列化组);
  • 若后续需支持集合级随机操作,应使用 collectionOperations 而非 itemOperations。

总结:"read" => false 本身有效,但其生效前提是 API Platform 能正确识别并路由到该自定义操作——而操作声明顺序,正是决定这一识别是否成功的隐式契约。

相关专题

更多
数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.29

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

412

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

495

2024.05.29

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

0

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

13

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

87

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

111

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

155

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号