首页 > 解决方案 > 具有自定义请求正文的 API 平台自定义资源

问题描述

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

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

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

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

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

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

/**
 * @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 数据。有没有办法我可以以某种方式访问​​这些数据然后处理它。

标签: phpapisymfonyapi-platform.com

解决方案


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

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

最后,还有数据转换器允许您控制如何将输入(请求负载)转换为资源,或者如何将资源转换为输出(响应负载)。这似乎是您正在寻找的。但是,我建议在走这条路之前考虑我以前的观点。


推荐阅读