Symfony2 {{ render(controller(...)) }} get "parent" controller and action



在我的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(...)) }} ?

好的做法是通过路由来依赖类。如:

<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 %}
">

你可以把这个逻辑移动到树枝扩展,得到这样的东西:

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

也许我不应该使用{{渲染(控制器(…))}}在所有?

是的,为此做一个子请求有点过头了。在我看来,使用自定义分支函数可能是实现目标的更好方法。

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

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

但更倾向于使用twig函数方法

最新更新