Php Symfony FOSRestBundle操作订单
我使用symfony3和FOSRestBundle开始了一个新的RESTAPI项目。一切正常,但我有个问题。我在控制器和路由器配置上有两个操作:Php Symfony FOSRestBundle操作订单,php,rest,annotations,symfony,fosrestbundle,Php,Rest,Annotations,Symfony,Fosrestbundle,我使用symfony3和FOSRestBundle开始了一个新的RESTAPI项目。一切正常,但我有个问题。我在控制器和路由器配置上有两个操作: api_marcas_get_all_marca_paginated get ANY/api/marca/{limit}/{page}.{u format} api\u marcas\u delete\u remove\u marca获取任何/api/marca/delete/{marcaid}.{u format} 问题是,当我(从邮递员那里)给这个
api_marcas_get_all_marca_paginated get ANY/api/marca/{limit}/{page}.{u format}
api\u marcas\u delete\u remove\u marca获取任何/api/marca/delete/{marcaid}.{u format}
问题是,当我(从邮递员那里)给这个打电话时:
另一个动作(api_marcas_get_all_marca_paginated)响应
是的。。我知道我可以使用“删除”http方法,这是可行的。。。但是为什么会发生碰撞
以下是我的行动:
/**
* @Rest\Get("/marca/{limit}/{page}")
*/
public function getAllMarcaPaginatedAction(Request $request)
{... code here ...}
及
按那个命令
我做错了什么?
和行动顺序有关吗?谢谢…之所以会发生这种情况,是因为这些规则是按顺序考虑的,并且会进行第一次匹配 在您的示例中,
/api/marca/delete/105
第一条规则匹配为delete
作为{limit}
和105
作为{page}
您可以为{limit}
定义一些要求,以便只匹配某些模式。在这里,您可以找到一些如何使用需求
注释的示例:
另一方面,建议不要将
GET
方法用于更改应用程序状态的操作(如删除项目),因为这被认为是一种错误。谢谢@dubrox的评论。您有什么建议来避免路线出现此类问题吗?我刚刚更新了我的答案,建议使用requirements
属性来避免这种模式冲突。但是在您的特定情况下,您应该真正避免使用GET
进行删除,如果您确实不想使用HTTP标准DELETE
,至少应该使用POST
方法。
/**
* @Rest\Get("/marca/{limit}/{page}")
*/
public function getAllMarcaPaginatedAction(Request $request)
{... code here ...}
/**
* @Rest\Get("/marca/delete/{marcaid}")
*/
public function deleteRemoveMarcaAction(Request $request)
{ ... //code here... }