【问题标题】:Pass parameter to all views将参数传递给所有视图
【发布时间】:2012-03-25 08:17:37
【问题描述】:

我想在我的所有 Twig 视图上显示用户名/上次连接日期/时间和一些其他信息(它们都从一个常见的 Twig 布局扩展而来)。

如何在不必将这些参数从每个控制器显式传递到每个视图的情况下实现这一点?

我是否必须创建一个 Twig 扩展程序,或者调用一个控制器/动作以使用 render 从布局中检索用户名/连接/其他信息?

如果可能的话,我想要一个更简单的解决方案。

【问题讨论】:

    标签: controller symfony parameter-passing twig


    【解决方案1】:

    最简单的解决方案是从您的模板/布局中embed controllers。但请注意,子请求的成本很高,并且会显着影响性能。如果在某些时候您会注意到您的应用程序的开发版本非常慢,那么请知道原因可能是每个请求都有多个子请求。

    下一个解决方案是Twig extensions。在大多数情况下,您需要functions。你可以这样称呼它:

    {{ user_info(user) }}
    

    我首先从嵌入控制器开始,但我的开发版本达到了我网站上的大多数页面在 30 秒内超时的地步。我一开始不知道原因,但一发现原因,我就用 Twig 扩展替换了所有子请求。此后性能恢复正常。

    【讨论】:

    • 你有没有试过在没有 teig 模板的情况下渲染一个控制器,即在一个纯 PHP 类中?此解决方案是否也会影响性能?
    • @JeanValjean,原因在于子请求本身——而不是 Twig。
    • 是的,我想到了类似的东西......谢谢!
    【解决方案2】:

    用户可作为预定义的全局变量访问,请查看this,如果您想在所有模板中重复使用相同的模板片段,请查看include 标签。

    【讨论】:

    • 我实际上是在使用来自 twig 的会话 (app.session.get('myuser').myProperty ) 来获取我需要的信息,因为我存储的信息比用户变量。
    【解决方案3】:

    我不知道这个问题在 2012 年发布时是否可用,但我会使用 Twig Globals。

    来自http://twig.sensiolabs.org/doc/advanced.html#globals

    全局变量

    全局变量和其他模板变量一样,除了 它适用于所有模板和宏:

    $twig = new Twig_Environment($loader);
    $twig->addGlobal('text', new Text());
    

    然后您可以在模板中的任何位置使用 text 变量:

    {{ text.lipsum(40) }}
    

    我把代码放在每次都会被调用的地方,比如控制器构造函数或类似的东西。

    【讨论】:

      【解决方案4】:

      上个月才有这个用例。转向render 命令,它真的很管用,因为调用的控制器操作不必定义@Route...甚至没有@Template,但这取决于你;)

      【讨论】:

        猜你喜欢
        • 2011-06-27
        • 2018-01-08
        • 2011-10-07
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 2013-07-17
        相关资源
        最近更新 更多