Symfony2 – получить текущий маршрут основного запроса в частичном / подзапросе

В части Twig, частично обработанной отдельным контроллером, я хочу проверить, соответствует ли текущий основной маршрут сравниваемому маршруту, поэтому я могу отметить элемент списка как активный.

Как я могу это сделать? Попытка получить текущий маршрут в BarController:

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

возвращает null .

Uri тоже не то, что я ищу, так как звонил под кодом в bar :

 app.request.uri 

возвращает маршрут, похожий на: localhost/_fragment?path=path_to_bar_route

Полный пример

Главный контроллер: FooController расширяет контроллер {

  public function fooAction(){} } 

fooAction twig:

 ...some stuff... {{ render(controller('FooBundle:Bar:bar')) }} ...some stuff... 

Контроллер панели:

 BarController extends Controller{ public function barAction(){} } 

barAction twig:

 <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> 

Решение pabgaran должно работать. Однако исходная проблема возникает, вероятно, из-за request_stack .

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

Поскольку вы находитесь в подзадаче, вы должны получить Request верхнего уровня ( master ) и получить _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', {'current_route' : app.request.uri})) }} 

Затем верните его в ответ:

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

И в вашем шаблоне сравнивается с полученным значением.

В противном случае, возможно, лучше использовать include вместо рендера, если вам не нужна дополнительная логика для частичного.

в ветке вы можете отправить объект запроса от главного контроллера к субконтроллеру в качестве параметра:

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

в субконтроллере:

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