【问题标题】:Symfony2 {{ render(controller(...)) }} get "parent" controller and actionSymfony2 {{ render(controller(...)) }} 获取“父”控制器和操作
【发布时间】:2014-03-17 10:41:40
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: symfony controller action twig


    【解决方案1】:

    良好的做法是按路线依赖班级。喜欢:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      但更喜欢树枝函数的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        相关资源
        最近更新 更多