В части 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'); } }