在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
)
])]
通过使用值为false
的write
属性,可以将相同的功能应用于POST操作。
但是,需要注意的是,这种行为偏离了标准REST方法。可能值得考虑对您的方法进行重构,以与REST最佳实践保持一致。
例如,不用像这样的结构
GET /resource/{id}/{parameter}
你可能想选择:
GET /resource/{id}?parameter=sometitle
您可能还对通过uriVariables参数集成Subresource感兴趣。看见https://api-platform.com/docs/core/subresources/