2015-05-11 2 views
5

В частичном рендеринге Twig, выполняемом отдельным контроллером, я хочу проверить, соответствует ли текущий основной маршрут сравниваемому маршруту, поэтому я могу отметить элемент списка как активный.Symfony2 - получить текущий маршрут основного запроса в twig partial/subrequest

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

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

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

Uri также не то, что я ищу, как вызов ниже кода в bar «s прутик:

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

Поскольку вы в подзапрос, вы должны быть в состоянии получить верхнего уровня (master) Request и получить _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); 
} 

Не запускайте это, но оно должно работать ...

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

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

{{ 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'); 
} 
} 
Смежные вопросы