Symfony2 {{render(controller(...))}}得到“父”控制器和动作

时间:2014-03-17 10:41:40

标签: symfony controller action twig

在我的layout.html.twig(这是所有页面使用的基本布局)中,我有以下一行:

<body class="{{ render(controller('MyMainBundle:Main:bodyClass')) }}">

问题在于我想根据控制器和操作输出不同的类,但在“Main”控制器的“bodyClassAction”方法中,$request->attributes->get('_controller')显然会返回MyMainBundle:Main:bodyClass

所以,现在,我正在解析URL($_SERVER['REQUEST_URI'])以确定我应该返回哪个类,这不是很干净。

有没有办法知道“原始”或“父”控制器和动作?

也许我根本不应该使用{{ render(controller(...)) }}

2 个答案:

答案 0 :(得分:0)

  

也许我根本不应该使用{{render(controller(...))}}?

是的,对此提出子请求有点矫枉过正。在我看来,使用自定义树枝功能可能是实现目标的更好方法。

但要回答你的问题,你需要将控制器作为参数,例如:

{{ render(controller('MyMainBundle:Main:bodyClass', {
     'controller': app.request.get('_controller')
   })) }}

但更喜欢树枝功能方法。

答案 1 :(得分:0)

良好做法取决于路线。像:

<body class="
   {% if app.request.attributes.get('_route') == 'my_route' %}
       my-route-class
   {% elseif app.request.attributes.get('_route') == 'my_route1' %}
       my-route-class2
   {% endif %}
">

你可以将这个逻辑移到Twig extension并得到某些东西:

<body class="{{ getBodyClass(app.request.attributes.get('_route')) }}">

在你的范围内:

public function getFunctions() {
    return array(
        new \Twig_SimpleFunction('getBodyClass', array($this, 'getBodyClass'))
    );
}

public functiongetBodyClass($route) {
    if ($route === 'my_route_1') {
        return 'my-route-class'
    } else if ($route === 'my_route_2') {
        return 'my-route-class2'
    }
    return 'default-class';
}