0

编辑(2018/02/18): 由于我刚刚订阅了 SO,如果我的问题不清楚,或者格式有问题,请告诉我。

我在使用 Symfony4 和 API-Platform 创建 REST API 时遇到问题。

有效的东西:

我的 Symfony 项目中有三个实体:

  • 食谱(包括烹饪时间、步骤等)
  • 成分(带有描述、照片等)
  • LinkIR(其中包含指向配方的链接、指向成分的链接以及所述配方中所述成分所需的数量)

在使用 API-Platform 创建 API 时,我设法为每个实体创建基本的 CRUD 操作。

这里开始我的问题:

当我登陆我的“意大利面”页面(成分)时,我想显示每个使用意大利面的食谱(以及此食谱所需的数量)。我可以通过调用来做到这一点:

  • 一种获取我的意大利面数据的成分方法
  • N次LinkIR方法获取Recipe.id(和数量)列表
  • N次Recipe方法获取所有Recipe数据

这可以工作,但它会很慢,不可靠,并且会很快使我的 API 服务器超载。

有没有办法在只调用一次 API 时显示我的整个页面(1 个成分 + N 个链接 + N 个食谱)?我开始在 API-Platform's Subresources 的方向上搜索,但到目前为止没有结果。

4

1 回答 1

0

您可以为要包含的集合成员使用组注释。例如,如果成分与食谱有教义关系,您可以用组名称标记该关系。请注意,您需要将注释添加到您希望在回复中可见的所有成员。

/**
 * @Group("read")
 */
private $recipes;

此外,您需要告诉序列化过程以使用该组。

/*
 * @ApiResource(attributes={
 *     "normalization_context"={"groups"={"read"}}
 * })
 */
class Ingredient {

你应该能够从“其他方向”做同样的事情。 https://api-platform.com/docs/core/serialization

还要考虑在一个请求中执行此操作的正确级别。获取更大的教义集合并为它们补充水分最终会很慢。一个好的解决方案可能是在一个请求中获取特定成分的所有食谱。这只是一个普通的集合,带有一个过滤器,上面写着“ingedient x 的所有食谱”。 https://api-platform.com/docs/core/filters

于 2018-03-22T07:00:20.403 回答