2015-04-17 8 views
1

Я знаю, что есть дискуссии о том, какие лучшие методы обработки маршрутов в Symfony2 (routing.yml vs annotations). Просто позвольте мне упомянуть, что я хочу сохранить это, используя аннотации.Как использовать несколько аннотаций метода для определенных маршрутов?

Когда я определить несколько маршрутов для одного действия в контроллере, кажется, что последнее определение @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

Попробуйте указать метод в маршруте аннотации непосредственно (методы = «GET | POST») – rpg600

+0

Спасибо, что делает именно то, что я надеялся получить :) Просто отправить его как отдельный ответ, так что я могу поставить галочку это :) – nTOXIC

ответ

3

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

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

Я не думаю, что можно дважды объявить аннотацию @route или @Method. Вы можете создать значение по умолчанию для $ ид так:

/** 
* @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; 
} 

[править] Ok, на самом деле можно объявить несколько маршрутов в аннотации. Тем не менее, я не думаю, что вы должны снова объявить @Method. Я не уверен в этом, но мне кажется, что это:

@Method({"GET"}) 

является переопределение это:

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

И когда вы переопределить его, вы только осталось ГЭТ. Удалите аннотацию, которая объявляет только GET, и она должна работать.

+0

Можно объявить несколько маршрутов! Я использую также аннотации с 4 маршрутами в одном действии, и все они работают как ожидалось. Срезанный - это просто пример! – nTOXIC

+0

Ну, я думаю, что это делает то, что вы хотите добиться правильно? Кроме того, зачем вам нужно несколько маршрутов для одного и того же действия? Мне это кажется ненужным. –

+1

И я бы лично разложил методы. Существует наилучшая практика программирования, которая гласит: «метод должен делать только одно и только одно». Принимая это во внимание, у вас должен быть один метод для публикации элемента, один для индекса и один для чтения одного элемента. –