0

我目前正在尝试为我在 API 平台中的一个实体创建自定义 IRI。我知道文档中有页面描述了如何使用自定义 IRI ( https://api-platform.com/docs/core/identifiers/ ),但我无法让它工作。

我的实体使用值对象作为 id(当前用于 IRI)和名称(应该用于 IRI)。但是值本身在实体中是私有的和标量的。

API Platform 似乎从我的 XML Doctrine 映射中获取了应该用作标识符的信息。我已经尝试通过使用注释、属性和 YAML 定义来覆盖它。没有运气。

返回的错误内容如下:

preg_match(): 参数 #2 ($subject) 必须是字符串类型

(此时它接收值对象而不是实际值)

最好的问候,蜘蛛侠

4

1 回答 1

0

我解决了我的问题。

为了解释解决方案,我必须深入研究 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

于 2021-08-25T17:04:40.417 回答