问题描述
我是 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,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
。
这是正确的方法吗?我做错了什么?
解决方法
通过指定 "output"="string"
,您告诉 API 平台将您的 Tag
资源转换到一个 string
实例以进行输出。但是,string
不是类,无法实例化(或转换为)。
您想要的是告诉 API 平台将 Tag
转换为一个 represents your desired data representation 的对象。
例如,实现自定义 TagCollectionOutput
类(保存 Tag
名称数组)并将 "output"=TagCollectionOutput::class
添加到 Tag
。然后让 TagOutputTransformer
transform $data
变成一个 TagCollectionOutput
实例。