2016-11-19 42 views
1

我开始使用symfony3和FOSRestBundle作为REST API的新项目。一切都按预期工作,但我有一个问题。我有我的控制器上这两个动作和路由器的配置:Symfony FOSRestBundle操作步骤

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... } 

在这个顺序。

我做错了什么? 与动作的顺序有什么关系?谢谢...

回答

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

+0

感谢评论@dubrox。你有任何建议,以避免这种路线的问题? –

+0

我刚刚更新了我的答案,建议使用'requirements'属性来避免这种模式冲突。但在你的特定情况下,如果你真的不想使用HTTP标准的'DELETE',你应该真的避免'GET'来删除,并且至少使用'POST'方法。 – dubrox