【问题标题】:API Platform custom IRI with value objects带有值对象的 API 平台自定义 IRI
【发布时间】:2021-08-25 13:47:01
【问题描述】:
我目前正在尝试为我在 API 平台中的一个实体创建自定义 IRI。
我知道文档中有描述如何使用自定义 IRI (https://api-platform.com/docs/core/identifiers/) 的页面,但我无法让它工作。
我的实体使用值对象作为 id(当前用于 IRI)和名称(应该用于 IRI)。但值本身在实体中是私有的和标量的。
API Platform 似乎从我的 XML Doctrine 映射中获取了应该用作标识符的信息。我已经尝试通过使用注释、属性和 YAML 定义来覆盖它。没有运气。
返回的错误为:
preg_match(): 参数 #2 ($subject) 必须是字符串类型
(此时它接收的是值对象而不是实际值)
最好的问候,
仙女座
【问题讨论】:
标签:
symfony
rest
api-platform.com
value-objects
iri
【解决方案1】:
我解决了我的问题。
为了解释解决方案,我必须深入研究 API 平台响应生成。
- API 平台为其返回的每个实体生成一个 IRI(集合和项目操作)
- 它使用 Symfony 路由器生成 URI
- 所有必要的信息都可以从不同的来源(YAML、XML、注释、属性)绘制 API 平台
- 信息包括为实体资源定义的标识符
- API 平台通过 Symfony 属性访问器获取标识符的值
- 因为属性访问器在通过反射访问私有属性之前使用了getter,所以它会返回VO
- Symfony URL 生成器不能使用普通的 VO 来创建 URL
正如我所解释的,我也在为我的 ID 使用 VO。所以我试图弄清楚为什么它使用 Id VO 而不是名称 VO。
简单的答案:Id VO 实现了 __toString 方法,而名称 VO 没有。所以解决的办法就是让名字VO也实现这个方法。
深入API平台的内部流程很有意思,但我也觉得有点傻:D