我正在使用API Platform 3和Symfony 6来构建一个API。我有一个ORM实体订阅者。要更改订阅服务器的某些字段,我希望将PUT与数据传输对象(DTO)一起使用。因为我需要底层的Subscriber,并希望API平台检查这个Subscriber是否存在(如果不存在,则返回404)并自动检索它(在StateProcessor中使用),所以我试图将URL中的Subscriber的标识符作为uriVariable(在URI中称为subscriberId,但Subscriber中的实际标识符只是id)。
然而,这总是返回404,可能是因为他试图检索具有subscriberId的SaveSubscriberDetails DTO对象,这无法工作,因为它不是任何地方都持久化的ORM实体。API路由存在。当我删除ApiResource配置中的uriVariable时,我到达状态处理器(通过调试检查)。当我把它留在里面时,我永远不会到达状态处理器。具有我在URL中传递的ID的订阅服务器确实存在。
我的尝试:
#[ApiResource(
uriTemplate: '/subscriber/{subscriberId}/saveDetails',
operations: [
new Put(input: SaveSubscriberDetails::class, processor: SaveSubscriberDetailsProcessor::class),
],
uriVariables: [
'subscriberId' => new Link(
fromProperty: 'id',
fromClass: Subscriber::class
),
],
output: SaveSubscriberDetails::class
)]
我是不是做了什么根本性的错误?
- 我是否只是以错误的方式使用了链接属性?
- 我是否需要将int类型的私有属性subscriberId或Subscriber类型的属性订阅者添加到我的SaveSubscriberDetails DTO中以链接到它?
- 是否需要自定义产生SaveSubscriberDetails对象的反序列化过程?
- 我是否可以/应该只传递subscriberId uriVariable,并告诉他不要解释它,而是从SaveSubscriberDetailsProcessor状态处理器中的数据库中检索底层Subscriber对象?
1条答案
按热度按时间ghhkc1vu1#
我认为你需要在operations键下传递你的uriTemplate / uriVariables / output,像这样(https://api-platform.com/docs/core/operations/#configuring-operations):