Symfony2 - 在twig partial / subrequest中获取主要请求的当前路由

时间:2015-05-11 11:03:22

标签: php symfony twig

在由单独控制器呈现的Twig部分中,我想检查当前主路由是否等于比较路由,因此我可以将列表项标记为活动。

我该怎么做?试图在BarController中获取当前路线,如:

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

返回null

Uri也不是我想要的,因为在bar的树枝中调用下面的代码:

app.request.uri

返回类似于:localhost/_fragment?path=path_to_bar_route

的路线

完整示例

主控制器:     FooController扩展了Controller {

    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>

3 个答案:

答案 0 :(得分: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 );
}

没有运行,但它应该工作......

答案 1 :(得分: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而不是渲染。

答案 2 :(得分:1)

在twig中,您可以将请求对象从主控制器发送到子控制器作为参数:

{{ 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');
}
}