Как использовать аннотации нескольких методов на определенных маршрутах?

Я знаю, что есть обсуждения того, как лучше всего обрабатывать маршруты в 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, используя вместо этого аннотации?

1

Решение

Вы должны указать методы в каждой аннотации маршрута, @Method должен быть объявлен только один раз. Фактически каждый тип аннотации обрабатывается отдельно, они не знают друг о друге.

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

Другие решения

Я не думаю, что можно объявить аннотацию @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, и она должна работать.

0