在我的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函数方法