我开始使用symfony3和FOSRestBundle为REST API启动新的项目。一切都按预期工作,但我有一个问题。我在我的控制器和路由器配置上有这两个动作:
api_marcas_get_all_marca_paginated GET ANY ANY /api/marca/{limit}/{page}.{_format}
api_marcas_delete_remove_marca GET ANY ANY /api/marca/delete/{marcaid}.{_format}
问题是当我打电话给这个时(来自邮递员):
127.0.0.1:8000/api/marca/delete/105
另一个动作(api_marcas_get_all_marca_paginated)响应......
是的..我知道我可以使用“DELETE”http方法,这是有效的......但......为什么它们会发生碰撞?
以下是我的行动:
/**
* @Rest\Get("/marca/{limit}/{page}")
*/
public function getAllMarcaPaginatedAction(Request $request)
{... code here ...}
和
/**
* @Rest\Get("/marca/delete/{marcaid}")
*/
public function deleteRemoveMarcaAction(Request $request)
{ ... //code here... }
在那个订单上。
我做错了什么? 与行动的顺序有什么关系?感谢...
答案 0 :(得分:1)
之所以会发生这种情况,是因为这些规则是按顺序考虑的,并且会进行第一次匹配。
在您的示例/api/marca/delete/105
中,第一条规则与delete
匹配为{limit}
,105
与{page}
匹配。
您可以为{limit}
定义一些要求,以便仅匹配某些模式。您可以在此处找到有关如何使用requirements
注释的一些示例:http://symfony.com/doc/current/bundles/FOSRestBundle/param_fetcher_listener.html
另一方面,建议不要将GET
方法用于改变应用程序状态的操作(如删除项目),将其视为safe method。