API Platform 3 非标识符路径参数

问题描述 投票:0回答:2

在以前版本的 API Platform 中,您可以使用标准 Symfony 风格的路由参数定义操作的路径,即 /resource/{id}/{parameter}

在最新版本的 API Platform (v3) 中,这些路径的配置似乎已更改,因此您需要为每个参数创建一个 Link() 元数据,将它们直接映射到属性,而该属性又由学说使用动态改变查询。问题是我根本不希望 {parameter} 被链接,因为它不直接代表属性。

有没有办法将参数声明为非标识符?或者作为非 Link() ?如果您没有为其定义 uriVariables 条目,那么它会假定它是映射实体的 id。

symfony api-platform.com
2个回答
1
投票

我遇到了类似的问题,我使用实体本身的假公共属性(api-platform 2.7,标志为 3)解决了它,并将 {parameter} 映射到该属性

'id' => 'fake_public_property'


0
投票

API 平台 v3 或禁用

metadata_backward_compatibility_layer
的 v2.7,强制严格遵守 REST 约定和标准。

根据 REST 标准,只有 resource-id 应作为路径参数包含在 URI 中。因此,在 API Platform v3 中,行为发生了转变。平台假设任何 URL 参数都应转换为实体。

如果您希望阻止在自定义操作中自动检索实体,可以通过将

read
属性设置为
false
来实现此目的:

#[ApiResource(operations: [
    new Get(),
    new Post(
        name: 'publication', 
        uriTemplate: '/resource/{id}/{parameter}', 
        controller: CustomActionController::class, 
        read: false,
        write: false
    )
])]

通过使用值为

write
false
属性,可以将相同的功能应用于 POST 操作。

但是,需要注意的是,这种行为偏离了标准 REST 方法。也许值得考虑重构您的方法以与 REST 最佳实践保持一致。

例如,不要使用如下结构:

GET /resource/{id}/{parameter}

您可能想要选择:

GET /resource/{id}?parameter=sometitle

您可能还对通过 uriVariables 参数集成子资源感兴趣。请参阅https://api-platform.com/docs/core/subresources/

© www.soinside.com 2019 - 2024. All rights reserved.