用途:当 #[ApiResource] 类需要作为 API 契约、与 Doctrine 实体解耦时使用;适用于实体与 API 字段名称或格式不一致(重命名、格式化价格、计算值),以及创建、更新、列表操作需要各自输入或输出结构的场景,也用于迁移依赖已移除的 DataTransformerInterface 的旧代码。
主要能力:通过 Symfony Object Mapper 在 DTO 与实体之间建立映射,支持输入/输出分离的契约。
使用方式:需引入 symfony/object-mapper,并在 DTO 资源上设置 stateOptions: new Options(entityClass: ...);用 #[Map(source: ...)] 与 #[Map(target: ...)] 绑定 DTO 和实体,用 #[Map(transform: ...)] 处理计算字段;若输入输出结构不同,分别创建输入与输出类,并在各操作上用 input: 和 output: 接线;映射需要真实逻辑时,编写自定义 ProcessorInterface 调用 ObjectMapperInterface::map();对每个操作测试请求载荷与响应结构。
限制:自动 Object Mapper 的 provider 与 processor 仅在 stateOptions 含 entityClass 且 DTO 与实体都带 #[Map] 时生效;DataTransformerInterface 已移除,需改用 Object Mapper 或 provider/processor;3.4 及 Symfony 6.4 LTS 不支持 Object Mapper(需 Symfony 7.3+),此时需在 ProviderInterface 与 ProcessorInterface 中手动映射;5.0 移除了 ObjectMapperProcessor,自动路径使用 ObjectMapperInputProcessor 与 ObjectMapperOutputProcessor(4.3+);不要从 DTO 资源直接返回实体,只有被映射的字段会到达客户端。