API平台3非标识符路径参数



在API平台的早期版本中,您可以使用标准Symfony样式的路由参数定义操作的路径,即/resource/{id}/{parameter}

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

有没有一种方法可以将参数声明为非标识符?或者作为非链接((?如果您没有为它定义uriVariables条目,那么它会假设它是映射实体的id。

我遇到了一个类似的问题,我在实体本身中使用了一个假的公共属性(api平台2.7,标志为3(解决了这个问题,并将{parameter}映射到该属性

'id'=>'fake_public_property'

neneneba API平台v3或v2.7在禁用metadata_backward_compatibility_layer的情况下,强制更严格地遵守REST约定和标准。

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

如果希望防止在自定义操作中自动检索实体,可以通过将read属性设置为false:来实现

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

通过使用值为falsewrite属性,可以将相同的功能应用于POST操作。

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

例如,不用像这样的结构

GET /resource/{id}/{parameter}

你可能想选择:

GET /resource/{id}?parameter=sometitle

您可能还对通过uriVariables参数集成Subresource感兴趣。看见https://api-platform.com/docs/core/subresources/

最新更新