Route @Method 注释在匹配路由时似乎没有得到尊重

Route @Method annotation doesn't seem to get respected when matching routes

我理解在允许类似的可访问路线时,路线的顺序很重要。

我感到困惑的是,为什么向这条路线提交 DELETE 请求时,它是否与 GET 路线匹配,而不是忽略它并尝试下面的匹配方法?

    /**
     * @Route("/{game}")
     * @Method({"GET"})
     */
    public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
        $out = $gameSerializer->bind($game);
        return new JsonResponse($out);
    }

    /**
     * @Route("/{game}")
     * @Method({"DELETE"})
     */
    public function remove(Request $request, Game $game) {
        $em = $this->getDoctrine()->getManager();


        $em->remove($game);
        $em->flush();

        return new JsonResponse([], 200);
    }

完全公开

我明白为什么它根据严格的模式匹配最上面的路由

理解为什么访问方法在这样做时被忽略

所以,为了测试,我调整了将基于 DELETE 的路线向上移动到 GET 路线

之上

    /**
     * @Route("/{game}")
     * @Method({"DELETE"})
     */
    public function remove(Request $request, Game $game) {
        $em = $this->getDoctrine()->getManager();

        $em->remove($game);
        $em->flush();

        return new JsonResponse([], 200);
    }

    /**
     * @Route("/{game}")
     * @Method({"GET"})
     */
    public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
        $out = $gameSerializer->bind($game);
        return new JsonResponse($out);
    }

只有..当我尝试通过在浏览器中执行访问url的基本操作来获取现有的非测试记录时才会发生这种情况(因此,GET

天啊,它有没有删除那条记录。

为什么访问方法被忽略了?

首先,请注意您使用的 SensioFrameworkExtraBundle 版本,因为来自 SensioFrameworkExtraBundle[=24= 的 @Method 注释] 在最新版本中已被 删除 。相反,Symfony @Route 注释定义了一个方法选项来限制路由的 HTTP 方法:

*
* @Route("/show/{id}", methods={"GET","HEAD"})
*

但在您的情况下,如果您使用的是 HTML 表单和 HTTP 方法而不是 GET 和 POST,则需要包括一个 _method 参数来伪造 HTTP 方法。

See How to Change the Action and Method of a Form for more information.

我认为你必须添加路由名称并且它必须是唯一的。

尝试以下方式:

/**
     * @Route("/{game}",name="api_remove")
     * @Method({"DELETE"})
     */
    public function remove(Request $request, Game $game) {
      ...
    }

    /**
     * @Route("/{game}",name="single_remove")
     * @Method({"GET"})
     */
    public function single(Request $request, GameSerializer $gameSerializer, Game $game) {
       ...
    }