【问题标题】:Twig macros VS includes?Twig 宏 VS 包括?
【发布时间】:2011-10-03 04:09:58
【问题描述】:

我无法真正理解 Twig 中 ma​​crosincludes 之间的区别:两者似乎都在做同样的事情,即采用一些变量并输出一些东西。

有什么区别以及为什么使用宏或包含?

【问题讨论】:

    标签: symfony macros include twig


    【解决方案1】:

    使用包含,您可以逐字包含整个模板。该模板可以访问当前范围内的任何模板变量。

    使用宏,您可以在 Twig 中定义一种函数(不要与 Twig 函数混淆,它可以访问其他应用程序逻辑,而不仅仅是传递给模板的数据),它可以在给定适当对象的情况下呈现特定组件。所以你可以有一个宏来渲染,比如说,一个以购物清单为参数的购物清单——然后你可以重用这个宏,而不用担心你是否在其他地方以同样的方式将数据传递到模板中。未显式传递给宏的变量将不在该宏的范围内。

    宏应该真正完成一项特定任务来获取一些数据并呈现可重用的组件。包含可以包含任何内容 - 这取决于您。与 Smarty 相比,Twig 模板工作方式的可扩展性意味着您可能会在设计上使用包含更少的内容 - 但仍有一些用例是避免模板中重复的最简单方法.

    【讨论】:

    • 关于模板可以访问当前范围内的任何模板变量的部分并不完全正确。您可以这样做:{% include 'template.html.twig' with {'custom_var': custom_value } only %} 这将阻止包含的模板访问父上下文。这将使include 的功能与macro 非常相似,主要区别在于它们的声明和调用方式。
    • 包含的模板可以使用扩展,因此它们更强大。但是宏被设计为一组用于相同目的的函数,因此您可以将模板分解为一堆宏。但在某些情况下,我看不出有什么不同。
    【解决方案2】:

    尽管这个问题有一个公认的答案,但我认为指出 twig 中 includemacro 之间的一些关键区别很重要。

    1. (显而易见):您可以在单个文件中定义多个宏,从而为每个文件生成多个可重用的代码块。一个包含总是被完全包含,因此每个文件有一个可重用的代码块。

    2. 如果您打算在循环中使用这两个选项,那么这两个选项之间存在显着的性能差异。根据我的 10k 次迭代测试,这里是渲染模板的时间:

    • 原始 HTML:0.0015 秒
    • 宏:0.040 秒(慢 27 倍)
    • 包括:0.1584 秒(慢 105 倍)

    import 在此迭代之外被调用。

    1. 如果您使用include '...' with {...},那么您将整个上下文传递给包含的模板,并且所有上下文变量(参数)都是可选的。使用宏,您可以定义所需的参数,这有时很方便。

    2. 您可以在调用宏的同一模板中定义宏。不能使用包含。

    3. 要使用宏,您的模板中至少需要两条语句:一条用于导入宏,另一条用于使用它。使用 include 只是一个语句,更简洁。

    【讨论】:

      【解决方案3】:

      我是 Symfony2 的新手,但我认为 twig 宏和 include 之间的区别如下。

      include:用于定义页面中常用的部分,例如header、sidebar或slot。

      宏:用于定义视图相关的功能,如分页等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        相关资源
        最近更新 更多