php 在API Platform/Symfony中使用DTO并使用uriVariable检索ORM子资源

ecr0jaav  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(154)

我正在使用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对象?
ghhkc1vu

ghhkc1vu1#

我认为你需要在operations键下传递你的uriTemplate / uriVariables / output,像这样(https://api-platform.com/docs/core/operations/#configuring-operations):

#[ApiResource(
    operations: [
        new Put(
            uriTemplate: '/subscriber/{subscriberId}/saveDetails',
            uriVariables: [
                'subscriberId' => new Link(
                    fromProperty: 'id',
                    fromClass: Subscriber::class
                ),
            ],
            input: SaveSubscriberDetails::class,
            output: SaveSubscriberDetails::class,
            processor: SaveSubscriberDetailsProcessor::class,
        ),
    ],
)]

相关问题