2015-11-06 78 views
2

我想用if..else語句在控制器中執行操作,它會分析路由並相應地執行操作。這可能嗎?Symfony 2,有條件定義路線嗎?

路線:blog\post\{tag} or blog\post. 標籤是一個數組,因此最有可能它看起來像標籤= 1,2,3,4,51

controller action diplaypost() 
{ 
if (!isset($_GET['tag'])) {do smth; //case of route blog\post} 
else {do smth; //case of route blog\post\{tag} } 
} 
+0

這可能適用:http://symfony.com/doc/current/book/routing.html#completely-customized-route-matching-with-conditions但我認爲你真正需要的是給標籤一個默認值的空值。 – Cerad

回答

1

你可以得到當前路由的名字是這樣的:?

$route = $request->attributes->get('_route'); 

您現在可以使用$route來滿足您需要的任何邏輯。

0

你想要做什麼(你正在執行的操作)與每條路線?第一個是通過標記來過濾帖子列表,而第二個則是簡單地顯示所有帖子?在現實中這是兩條路線去同樣的動作,並會被定義爲

blog_post: 
    path: blog/post 
    defaults: { _controller: YourController:YourAction, tag: null } 

blog_post_tag: 
    path: blog/post/{tag} 
    defaults: { _controller: YourController:YourAction } 

那麼你的控制器動作將是:

public function yourAction($tag = null) 
{ 
    if ($tag === null) { 
     // something 
    } else { 
     // something else 
    } 
} 

雖然@Elnur Abdurrakhimov是對他的回答是正確的,做這個方式通常是和代碼味道的指示,應儘可能避免。

另外在你的例子中,你正在使用超級全局$_GET,你不應該在Symfony 2中做並且應該使用Request對象。 See the documentation關於如何在控制器方法中執行此操作。

+0

你並不需要分開這些路線。你可以只有一個,並仍然使其工作 – DonCallisto

+0

如何使這是標記是一個數組?最有可能在URL中看起來像?tag = 1,2,3,4,51 – olga

+0

您只能通過編寫自己的[ParamConverter](http://symfony.com/doc/master/bundles/SensioFrameworkExtraBundle/註解/ converters.html)。更簡單地說,只需在行動中執行'$ tags = explode(',',$ tag)''。通過查詢參數傳遞數組本身就有點笨重,例如'?標籤[] = 1&標籤= [] 2&標籤[] = 3'。 –