2015-04-17 26 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註解兩次。你可以像這樣創建的$ 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

有可能宣佈多條路線!我在一次操作中也使用了4條路線的註釋,並且它們都按預期工作。剪切只是一個例子! – nTOXIC

+0

那麼,我認爲這是你想達到的目的嗎?另外,爲什麼你需要多條路線來執行相同的操作?對我來說似乎沒有必要。 –

+1

我會親自拆分方法。有一個編程最佳實踐指出:「一種方法應該只做一件事而且只做一件事」。考慮到這一點,你應該有一種方法來發佈一個項目,一個用於索引,另一個用於閱讀單個項目。 –

相關問題