在以前版本的 API Platform 中,您可以使用标准 Symfony 风格的路由参数定义操作的路径,即 /resource/{id}/{parameter}
在最新版本的 API Platform (v3) 中,这些路径的配置似乎已更改,因此您需要为每个参数创建一个 Link() 元数据,将它们直接映射到属性,而该属性又由学说使用动态改变查询。问题是我根本不希望 {parameter} 被链接,因为它不直接代表属性。
有没有办法将参数声明为非标识符?或者作为非 Link() ?如果您没有为其定义 uriVariables 条目,那么它会假定它是映射实体的 id。
我遇到了类似的问题,我使用实体本身的假公共属性(api-platform 2.7,标志为 3)解决了它,并将 {parameter} 映射到该属性
'id' => 'fake_public_property'
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/