2013-02-02 49 views
0

我剛開始使用Symfony,我遇到了路由問題。這裏是路由fromt控制器:Symfony Newb Routing Issue

/** 
* @Route("/social/{name}/", name="_speed1") 
* @Route("/social/drivers/") 
* @Route("/social/drivers/{name}/", name="_driver") 
* @Route("/social/", name="_speed") 
* @Template() 
*/ 
public function unlimitedAction() 
{ 

如果我去加速/社會/或速度/社會/鮑勃或速度/社會/司機/或速度/社會/司機/鮑勃所有這些頁面的渲染沒問題。不過,我需要傳遞的名字,所以我改變

public function unlimitedAction() 
{ 

public function unlimitedAction($name) 
{ 

如果我去加速/社會/司機/或速度/社會/司機/鮑勃返回罰款。但是,如果我去加速/社會/然後我得到以下錯誤:

Controller "MyBundle\Controller\DefaultController::unlimitedAction()" 
requires that you provide a value for the "$name" argument (because there is 
no default value or because there is a non optional argument after this one). 

我不明白爲什麼它爲一個路線而不是其他。

所以我的問題是,我怎麼能acheive我的路由,這樣我就可以去:

speed/social/ 
speed/social/drivers/ 
speed/social/drivers/bob 

而且能夠把變量傳遞給操作沒有錯誤。

謝謝!

回答

2

要回答你的問題:你必須爲name參數提供一個默認值,對於在url中沒有{name}參數的每條路由。我現在不能測試,並使用註釋時,我不記得的語法,但應該是這樣的:

/** 
* @Route("/social/{name}/", name="_speed1", defaults={"name"=null}) 
* @Route("/social/drivers/{name}/", name="_driver", defaults={"name"=null}) 
* @Template() 
*/ 
public function unlimitedAction($name) 
{ 
} 

這樣,你應該能夠調用/social//social/foo以及/social/drivers//social/drivers/foo

但是,真的,這不是正確的方式去。只是定義多個動作,每個綁定到一個單一的路線:

/** 
* @Route("/social", name="social_index") 
* @Template() 
*/ 
public function socialIndexAction() { } // /social 

/** 
* @Route("/social/{name}", name="social_show") 
* @Template() 
*/ 
public function socialShowAction($name) { } // /social/foo 

一般來說,每一種方法(每個動作)應着重做的只有一件事,應該儘可能的短。使用服務,讓你的控制器做他們應該做的事:理解用戶輸入,調用服務和顯示視圖。

+0

我想你也可以使用'unlimitedAction($ name = null)',但正如你所說,這不推薦。 –

+0

@WouterJ我同意,謝謝你的評論! – gremo

+0

感謝你們兩位,我一直是ReadingTFM,但你的答案真的有助於使它更清晰! – wali