【问题标题】:Twig - how to efficiently re-use codeTwig - 如何有效地重用代码
【发布时间】:2015-07-23 14:21:41
【问题描述】:

我有一个页面,可以在其中呈现许多用户的详细信息。每个用户的 html 都很重(工具提示等),所以我不想复制/粘贴相同的代码。我也想在不同的页面上重复使用相同的代码。

我使用 include 和参数,但我不确定性能会有多好。制作一个 Twig 扩展 并让函数根据传递的 User 实例生成 html 会更好吗?还是有其他更好的方法?

编辑:

这是我在多个页面的多个位置呈现的那种代码。

<span data-tooltip aria-haspopup="true" class="has-tip" title="{{ user.getJob }}, {{ user.getCompanyy.getName }}">
    {{ user.getFirstName }}, {{ user.getLastName }}
</span>

【问题讨论】:

  • 为什么不尝试两者并在两者上做一些基准测试。我相信这会因情况而异,具体取决于包含/执行的内容。当你在 app_dev 中加载 symfony 页面时,它应该告诉你渲染 twig 页面所花费的时间,并且在刷新时(在它被缓存之后)这个数字应该会下降。是不是觉得太过分了?

标签: symfony templates twig


【解决方案1】:

Include 是一个非常好的解决方案,完全符合您的需求。

您也可以使用宏 (documentation)。但尽量不要在宏中使用includerequire,因为如果包含的模板中有错误,错误所在的行将是您调用模板的行(不是您真正拥有错误),因此可能会变得非常难以调试。

正如您所说,Twig 扩展对于特定情况也可能很好。例如,如果您想显示价格,最好制作|price 扩展名,而不是包含一个小模板。但扩展更适合高度可重用的代码和短片模板。

顺便说一句,最坏的情况是使用render(controller(...)) 只是为了显示一个模板,因为它非常消耗内存。

编辑答案:

Here you will find a benchmark:所以在参数很多的情况下,扩展似乎是最好的解决方案。在您的简单情况下,两种解决方案都很好。就个人而言,当我有很多 HTML 和很少的参数时,我更喜欢使用包含。但这完全取决于你喜欢什么。

你甚至可以想象两者都做。

  • 包含 html 小部件
  • 以及用于连接用户名和姓的扩展名

像这样:

<span data-tooltip aria-haspopup="true" class="has-tip" title="{{ user.getJob }}, {{ user.getCompanyy.getName }}">
    {{ user|fullName }}
</span>

总之,Twig 提供了许多不同的工具,您可以自行选择适合自己的工具。

【讨论】:

  • 我已经编辑了我的问题。那么我是否正确地说这种代码扩展是最好的,并且对于任何更大的代码包含更有意义?
  • 谢谢,现在这有点离题了,但是如何从扩展程序访问转义过滤器?我想返回非转义的 html 但参数需要转义...
  • 您可以链接扩展调用。像这样 myVariable|myOwnExtension|raw
  • 关于render(controller(...)) 这在正确配置缓存的情况下是有效的,如果在应用程序中多次显示具有自己上下文的视图(例如小部件),则绝对有用。宏运行良好,非常适合通用代码(例如,显示附加到登录用户实体的照片+用户名 - 正是您需要的)。在您的基本布局中导入一个宏文件,您将可以在任何地方使用它们:-)。
  • 感谢所有这些澄清。我同意render(controller(...)) 可能有用,但正如我所说,如果它仅用于显示模板:这是一种矫枉过正,因此请谨慎使用。关于宏,它是一个非常有用的工具,但尽量不要在宏中使用includerender,因为错误不会记录到包含的模板中,错误停留在宏级别:所以它可能会变成地狱以便调试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多