【问题标题】:Symfony FOSRestBundle Actions OrderSymfony FOSRestBundle 操作顺序
【发布时间】:2016-11-19 03:03:29
【问题描述】:

我开始使用 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... }

按那个顺序。

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

【问题讨论】:

    标签: php rest annotations symfony fosrestbundle


    【解决方案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

    【讨论】:

    • 感谢@dubrox 的评论。您有什么建议可以避免路线出现此类问题吗?
    • 我刚刚更新了我的答案,建议使用requirements 属性来避免这种模式冲突。但是在您的特定情况下,您应该真正避免使用GET 进行删除,如果您真的不想使用HTTP 标准DELETE,至少使用POST 方法。
    猜你喜欢
    • 2018-12-22
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多