【问题标题】:Route @Method annotation doesn't seem to get respected when matching routes匹配路由时,Route @Method 注释似乎没有得到尊重
【发布时间】:2019-09-15 11:03:35
【问题描述】:

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

我感到困惑的是,为什么在向该路由提交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

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

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

【问题讨论】:

  • 您使用的是哪个版本的 Symfony?更重要的是哪个版本的 SensioFrameworkExtraBundle ?来自 SensioFrameworkExtraBundle 的 @Method 注释已在最新版本中删除

标签: symfony symfony4 symfony-routing


【解决方案1】:

我认为您必须添加路线名称,并且它必须是唯一的。

尝试以下方式:

/**
     * @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) {
       ...
    }

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • .....我得检查一下,这是什么时候发生的? :X 我承认距离我上次创建一个新的 symfony 项目已经有几个月了,但是这个东西甚至没有给我一个弃用通知:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2015-10-23
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多