如何在特定路由上使用多个方法注解?

How to use multiple method annotations on specific routes?

我知道有人在讨论在 Symfony2 中处理路由的最佳实践(routing.yml 与注释)。让我提一下,我想保持原样,使用注释。

当我在控制器中为单个操作定义多个路由时,@Method 注释的最后一个定义似乎覆盖了所有其他注释,这就是为什么我收到以下错误:

No route found for "POST /index": Method Not Allowed (Allow: GET, HEAD)

这只是我正在使用的一小段代码。

namespace MySelf\MyBundle\Controller;

use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

class MyController extends Controller{

    /**
     * @Route(
     *     "/index",
     *     name="index_default"
     * )
     * @Method({"GET", "POST"})
     *
     * @Route(
     *     "/index/{id}",
     *     name="index",
     *     requirements={
     *          "id": "\d+"
     *     }
     * )
     * @Method({"GET"})
     *
     * @return Response
     */
     public function indexAction($id = null){
          /*DO SOME FANCY STUFF*/
          ...
          return $response;
     }
}

虽然这工作得很好!

index_default:
    pattern: /index
    defaults: { _controller: MyBundle:MyController:index }
    requirements:
      _method: GET|POST

index:
    pattern: /index/{id}
    defaults: { _controller: MyBundle:MyController:index }
    requirements:
      _method: GET
      id: \d+

有没有想过使用注释代替 routing.yml 来实现它?

我认为不可能将@route 或@Method 注释声明两次。您可以像这样为 $id 创建一个默认值:

/**
 * @Route(
 *     "/index/{id}",
 *     name="index",
 *     requirements={
 *          "id": "\d+"
 *     },
 *     defaults={"id" = null}
 * )
 *
 * @Method({"GET", "POST"})
 *
 * @return Response
 */
public function indexAction($id)
{
    /*DO SOME FANCY STUFF*/
      ...
      return $response;
}

[编辑] 好的,实际上可以在注释中声明多个路由。但是,我认为您不应该再次声明@Method。我对此不确定,但似乎是这样的:

@Method({"GET"})

正在覆盖这个:

@Method({"GET", "POST"})

当您覆盖它时,您只剩下 GET。删除仅声明 GET 的注释,它应该可以工作。

你应该在每个路由注释中指定方法,@Method 只能声明一次。实际上每种类型的注解都是单独处理的,它们相互之间并不知道。

/**
 * @Route(
 *     "/index",
 *     name="index_default",
 *     methods="GET|POST"
 * )
 *
 * @Route(
 *     "/index/{id}",
 *     name="index",
 *     requirements={
 *          "id": "\d+"
 *     },
 *     methods="GET"
 * )
 *
 * @return Response
 */