api-platform.com - 为 API 平台中的自定义操作禁用 requestBody
问题描述
我想为没有参数的自定义 POST 路由操作禁用 openapi 的 requestBody 文档。为此,我尝试像这样扩展 openapi_context:
/*
* @ApiResource(
* ...
* itemOperations={
* ...
* "post_clone" = {
* ...
* "openapi_context"={
* "requestBody"=null
* }
* }
* }
* )
*/
将 requestBody 设置为null
orfalse
与跳过该值相同,并导致 POST 路由的默认文档。将 requestBody 设置为{}
在文档中写入空对象,但我需要的是在文档中跳过该键。
解决方案
你以错误的方式实施你的clone
操作。POST
操作是集合操作,而不是项目操作。即使今天您能够将POST
操作声明为项目操作,它也更有可能是 API 平台的副作用,而不是预期的行为。
为了尊重 API-Platform 生命周期,我建议您执行以下操作:
首先,将您的clone
操作声明为 POST 集合操作,使用命名为DTO 作为输入MyEntityCloneDto
:
use App\Dto\MyEntityCloneDto;
/**
* @ApiResource(
* collectionOperations={
* "get",
* "post",
* "clone" = {
* "method" = "post",
* "path" = "/my_entities/clone",
* "input" = MyEntityCloneDto::class,
* }
* }
* )
* @ORM\Entity(repositoryClass=MyEntityRepository::class)
*/
class MyEntity
然后创建输入 DTO:
namespace App\Dto;
use App\Entity\MyEntity;
use Symfony\Component\Validator\Constraints as Assert;
class MyEntityCloneDto
{
/**
* The entity to clone.
*
* @Assert\NotNull()
*/
public ?MyEntity $myEntity = null;
}
最后创建DataTransformer
:
namespace App\DataTransformer;
use ApiPlatform\Core\DataTransformer\DataTransformerInterface;
use App\Entity\MyEntity;
use ApiPlatform\Core\Validator\ValidatorInterface;
class MyEntityCloner implements DataTransformerInterface
{
private ValidatorInterface $validator;
public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}
public function transform($object, string $to, array $context = [])
{
$this->validator->validate($object);
return clone $object->myEntity; //add more logic if needed of course
}
public function supportsTransformation($data, string $to, array $context = []): bool
{
return MyEntity::class === $to;
}
}
MyEntity
使用 ID 5 进行克隆:
curl --request POST \
--header 'content-type: application/json' \
--header 'accept: application/ld+json' \
--data '{"myEntity": "/my_entities/5"}' \
http://example.com/api/my_entities/clone
这样,OpenAPI
视图显示真相并且您的操作保持稳定。
请注意,如果您需要clone
对所有实体进行操作,则可以重新使用数据转换器,因为它的方法没有类型化。但是为了制作Serializer
作品,每个实体都需要一个 DTO,因为它需要知道要克隆的实体的类型。
推荐阅读
- r - 关于 R 中 ggplot 中的分组
- angular - 如何使用 fetch in angular 从 api 访问精确数组?
- r - R导入一些以相同字符串开头的xlsx文件,忽略同一文件夹中的其他文件
- angular - Firebase 身份验证单元测试通过带有 Angular 的模拟器
- iis - 即使标头存在,HSTS 仍显示已禁用
- java - Kafka KStream-KStream leftjoin 使用自定义 TimestampExtractor 窗口化导致跳过过期段的记录
- node.js - 如何将 expressWinston 放入特定的类/服务中?
- javascript - 如何使javascript动画第二次工作
- python - 出于某种原因,当范围超出“16”时,我得到 KeyError: 16
- python - 如果没有提供值,则将变量的值保留在类中