API 具有自定义请求正文的平台自定义资源

API Platform custom resource with custom request body

我对 Symfony 和 API 平台还很陌生。我正在尝试创建一个自定义 resource/operation,它接收请求的主体,根据值从数据库中获取数据,然后 return 将实体的集合返回给客户端。

示例: 具有以下正文的 GET 请求:

{
   "trackName": "example"
   "anotherKey": "anotherValue"
}

根据这些属性我想查询数据,做计算然后return数据。

我正在尝试弄清楚如何使它成为 API 平台方式。我已经在谷歌上搜索并在文档中寻找了几个小时,但我找不到实现这一目标的方法。

我试过使用 CollectionDataProvider 和这样的控制器查询数据:

/**
 * @ApiResource(
 *     itemOperations={
 *          "tracks_custom_endpoint"={
 *              "method"="GET",
 *              "path"="/tracks/custom_endpoint",
 *              "controller"=MyController::class,
 *              "read"=false
 *          }
 *     }
 * )
 * @ORM\Entity(repositoryClass=SpotifyTrackRepository::class)
 */
class Track
{
   // Attributes, setters and getters
}

但是,无论哪种方式,我都无法分别访问请求正文和随请求一起发送的 JSON 数据。有什么方法可以让我以某种方式访问​​这些数据,然后对其进行处理。

首先,考虑 itemOperations 指定与 单个资源 交互的端点。而 collectionOperations 指定与 整个资源集合 交互的端点。听起来您的端点应该在 collectionOperations 下配置,因为您正在寻求 return 过滤资源集合,而不是单个资源。

其次,集合 GET 操作期望请求主体负载以提供集合 过滤器 是不常见的。这些通常使用查询参数提供。 API 平台附带许多 query parameter filters out of the box that cover most use cases (yours included). Otherwise use Extensions 用于更多自定义和复杂的集合过滤。

最后,Data Transformers 允许您控制如何将输入(请求负载)转换为资源,或如何将资源转换为输出(响应负载)。这似乎是你要找的。但是,我建议在走这条路之前考虑我之前的观点。