返回 API 平台中的字符串数组

时间:2021-03-13 16:27:40

标签: symfony api-platform.com

我是 API 平台的新手,正在尝试克隆现有的 API。我有一个实体 Tag,它具有一个 id 和一个名称的属性。 /api/tags 的默认行为是返回一个对象数组。类似的东西:

[
  {
    "id": 1,
    "name": "tag1"
  },
  {
    "id": 2,
    "name": "tag2"
  }
]

我真正想要的只是一个简单的字符串数组:

[
    "tag1",
    "tag2"
]

从文档来看,我好像需要注册一个数据转换器:

final class TagOutputTransformer implements DataTransformerInterface
{
    /**
     * {@inheritdoc}
     */
    public function transform($data, string $to, array $context = [])
    {
        return $data->name;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsTransformation($data, string $to, array $context = []): bool
    {
        return $data instanceof Tag;
    }
}

services.yaml:

services:
   
    'App\DataTransformer\TagOutputTransformer': ~

并注释我的实体:

/**
 * @ApiResource(
 *     collectionOperations={
 *         "get"={
 *             "method"="GET",
 *              "output"="string"
 *         }
 *     }
 * )
 * @ORM\Entity(repositoryClass=TagRepository::class)
 */

问题是将 string 放在注释中是无效的。我得到 Class string does not exist。如果我删除引号,我会得到 Couldn't find constant string

这是正确的方法吗?我做错了什么?

1 个答案:

答案 0 :(得分:0)

通过指定 "output"="string",您告诉 API 平台将您的 Tag 资源转换到一个 string 实例以进行输出。但是,string 不是类,无法实例化(或转换为)。

您想要的是告诉 API 平台将 Tag 转换为一个 represents your desired data representation 的对象。

例如,实现自定义 TagCollectionOutput 类(保存 Tag 名称数组)并将 "output"=TagCollectionOutput::class 添加到 Tag。然后让 TagOutputTransformer transform $data 变成一个 TagCollectionOutput 实例。