在Symfony 3中覆盖包含模板中的twig变量

时间:2017-10-11 22:17:51

标签: symfony twig

我试图覆盖所包含模板中的变量。

我可以在Symfony3 & Twig

中执行此操作

我的twig模板如下所示:

{% set foo = 'bar' %}
{% include 'first.html.twig' %}
{% include 'second.html.twig' %}

// first.html.twig  
{{ foo }}
{% set foo = 'second' %}

// second.html.twig  
{{ foo }}

我得到了这样的结果:

  

酒吧

但我希望:

  

第二个

3 个答案:

答案 0 :(得分:0)

以下Twig代码:

{% set a = 42 %}
{{ include("first.twig") }}

将编译成这一个:

 // line 1
 $context["a"] = 42;
 // line 2
 echo twig_include($this->env, $context, "first.twig");

twig_include原型是:

# lib/Twig/Extension/Core.php
function twig_include(Twig_Environment $env, $context, $template, $variables = array(), $withContext = true, $ignoreMissing = false, $sandboxed = false)

因此,变量是通过复制传递的,而不是通过包含模板中的引用传递的。因此,包含模板中的更改不会反映到包含模板。

此外,自Twig 2.0以来,一旦初始化twig运行时,就无法调用TwigEnvironment::addGlobal,因此使用简单的扩展就不会出现故障。

总而言之,您可以理解,如果您需要跨模板更新变量,则意味着某些模板包含业务逻辑,而Twig不是为此而构建的。您需要在控制器中准备整个上下文。

答案 1 :(得分:0)

或者,您可以从TWIG调用PHP类方法。生成pdf时所需的页面计数器示例。

自定义类:

class PageCounter 
{
    private $pageNumber = 0;

    public function incrementPageCounter()
    {
        $this->pageNumber ++;

        return $this->pageNumber;
    }
}

控制器:

....
$twigVariables = [
        ...
        'pageCounter' => new PageCounter()
    ];

return $this->render('template.html.twig', $twigVariables);

嫩枝模板(对象pageCounter可从任何包含的模板中获得)

{{ pageCounter.incrementPageCounter() }} / {{totalPages}}

答案 2 :(得分:-1)

为什么不使用include标记/功能覆盖您的变量,如:

{% include 'first.html.twig' with {'foo': 'second'} %}

或:

{ include('first.html.twig', {foo: 'second'}) }}