我目前正在尝试为我的API平台中的一个实体创建一个自定义IRI。我知道文档中有一页描述了如何使用自定义IRI (https://api-platform.com/docs/core/identifiers/),但我无法让它工作。
我的实体使用一个值对象作为id(目前用于IRI)和名称(应该用于IRI)。但是值本身是私有的,并且是实体中的标量。
API平台似乎从我的XML Doctrine映射中获得了应该用作标识符的信息。我已经尝试过使用注释、属性和YAML定义来覆盖它。没有运气。
返回的错误如下:
preg_match():参数#2 ($subject)必须是string类型
(此时它接收值对象而不是实际值)
最诚挚的问候,spigandromeda
我的问题解决了。
为了解释这个解决方案,我必须深入研究一下API平台响应生成。
- API平台为它返回的每个实体(收集和项目操作)生成一个IRI
- 它使用Symfony路由器生成URI
- 所有必要的信息可以从不同的来源(YAML, XML,注释,属性)绘制API平台
- 信息包括为实体资源 定义的标识符
- API平台通过Symfony属性访问器 获取标识符的值
- 因为属性访问器在通过反射访问私有属性之前使用了getter,它将返回VO
- 普通的VO不能被Symfony URL生成器用来创建URL
正如我所解释的,我也使用VO作为我的Id。所以我试着弄清楚为什么它可以使用Id VO而不是名称VO。
简单的回答:Id VO实现了__toString方法,而名称VO没有。因此,解决方案是让名称VO也实现此方法。
深入研究API平台的内部过程很有趣,但我也觉得有点傻:D