如何传递当前上下文以包含在 Twig 中?

How to pass the current context to include in Twig?

假设我有以下 headline.twig 部分:

<h2>{{ headline }}</h2>

我想把它放在两个地方,一次是:

<% for article in teasers %>
  {{ include('headline.twig') }}
<% endfor %>

然后简单地:

{{ include('headline.twig') }}

是否可以传递一个 include 标签或函数其上下文,以便包含 "knows" ,在第一个实例中 headline 变量实际上是 article.headline

我正在寻找一种系统的方法来做到这一点,而不是像

{{ include('headline.twig', {headline: article.headline}) }}

默认情况下,整个上下文都传递给包含的模板。

所以它将在 headline.twig:

中工作
<h2>{{ article.headline }}</h2>

然后在主模板中你只调用:

{% include('headline.twig') %}

但是 article 变量必须在调用时定义 include

如果您希望 headline 在所有情况下都位于包含文件的主要上下文中,您可以这样做:

{% for article in teasers %}
  {% set headline = article.headline %}
  {{ include('headline.twig') }}
{% endfor %}

但是,如果您以这种方式重新设置它,这将覆盖当前上下文中任何现有的 headline 变量(并且有可能重复 teasers.article.headline 的最后一次迭代 2 次)。

如果您想保留当前上下文并覆盖 headline 变量,最好的解决方案是使用 merge 过滤器:

{% for article in teasers %}
  {{ include('headline.twig', _context|merge({headline: article.headline})) }}
{% endfor %}