2015-05-11 57 views
5

在由單獨控制器部分呈現的樹枝中,我想檢查當前主路由是否等於比較路由,因此我可以將列表項目標記爲活動。Symfony2 - 獲取主要請求的當前路由在樹枝部分/子請求

我該怎麼做?試圖讓BarController當前路徑,如:

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

回報null

Uri也沒有什麼,我正在尋找,如調用下面的代碼bar的樹枝:

app.request.uri 

返回路線類似於:localhost/_fragment?path=path_to_bar_route

完整的示例

主控制器: FooController擴展控制器{

public function fooAction(){} 
} 

fooAction樹枝:

...some stuff... 

{{ render(controller('FooBundle:Bar:bar')) }} 

...some stuff... 

吧控制器:

BarController extends Controller{ 

    public function barAction(){} 
} 

barAction樹枝:

<ul> 
    <li class="{{ (item1route == currentroute) ? 'active' : ''}}"> 
     Item 1 
    </li> 
    <li class="{{ (item2route == currentroute) ? 'active' : ''}}"> 
     Item 2 
    </li> 
    <li class="{{ (item3route == currentroute) ? 'active' : ''}}"> 
     Item 3 
    </li> 
</ul> 

回答

12

pabgaran的解決方案應該工作。但是,最初的問題可能是由於request_stack

http://symfony.com/blog/new-in-symfony-2-4-the-request-stack

既然你是在一個子請求,你應該能夠得到頂級(masterRequest並獲得_route。這樣的事情:

public function barAction(Request $request) { 
    $stack = $this->get('request_stack'); 
    $masterRequest = $stack->getMasterRequest(); 
    $currentRoute = $masterRequest->get('_route'); 

    ... 
    return $this->render('Template', array('current_route' => $currentRoute); 
} 

沒有運行這個,但它應該工作...在子控制器

{{ render(controller('FooBundle:Bar:bar', {'request' : app.request})) }} 

2

我認爲你的情況最好的解決方案是經過目前的主要路線在渲染中:

{{ render(controller('FooBundle:Bar:bar', {'current_route' : app.request.uri})) }} 

接下來,在響應返回它:

public function barAction(Request $request) { 
    ... 
    return $this->render('Template', array('current_route' => $request->query->get('current_route')); 
} 

且模板中與接收到的值進行比較。

否則,如果您不需要額外的部分邏輯,那麼最好使用include而不是渲染。

+1

感謝編輯,@ A.L。 – pabgaran

1

在樹枝可以從主控制器發送請求對象子控制器參數

BarController extends Controller{ 

    public function barAction(Request $request){ 
// here you can use request object as regular 
$country = $request->attributes->get('route_country'); 
} 
}