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

时间:2021-03-20 17:19:14

标签: php api symfony api-platform.com

我对 Symfony 和 API 平台非常陌生。我正在尝试创建一个自定义资源/操作,它接收请求的正文,根据值从数据库中获取数据,然后将实体的集合返回给客户端。

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

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

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

我正在尝试弄清楚如何使其成为 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 数据。有没有办法以某种方式访问​​这些数据然后处理它。

1 个答案:

答案 0 :(得分:1)

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

其次,集合 GET 操作期望请求正文有效负载以提供集合过滤器是不常见的。这些通常使用查询参数提供。 API 平台随附了许多开箱即用的 query parameter filters,涵盖了大多数用例(包括您的用例)。否则,请使用 Extensions 进行更自定义和更复杂的集合过滤。

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

相关问题