如何在树枝模板文件中定义全局变量


How can I define global variables inside a twig template file?

是否可以在树枝文件中设置全局变量,以便我可以从其他文件、宏和块访问该变量。

例如,我想拥有variables.twig文件并在其中设置我的变量,然后我可以将其包含在其他模板中。

我知道可以从框架(例如Symfony)设置全局变量,但我想要一个仅使用twig功能的解决方案。

使用 Symfony 配置

如果您使用的是 Symfony2+,您可以在config.yml文件中设置全局变量:

# app/config/config.yml
twig:
    # ...
    globals:
        myStuff: %someParam%

然后在应用程序中的任何位置使用 {{ myStuff }}

<小时 />

使用 Twig_Environment::addGlobal

如果您在另一个项目中使用 Twig,则可以直接在环境中设置全局变量:

$twig = new Twig_Environment($loader);
$twig->addGlobal('myStuff', $someVariable);

然后在应用程序中的任何位置使用 {{ myStuff }}

<小时 />

使用树枝模板

当您包含一段 Twig 代码时,您只包含来自该代码的呈现视图,而不是代码本身。因此,根据设计,不可能以您正在寻找的方式包含一组变量。

似乎您可以在顶级模板中分配全局 READONLY 变量,并在所有基础模板中使用它们。但你当然不能覆盖它们。它涵盖了我的情况,也许对其他人有用。

基.html.树枝

<!DOCTYPE html>
{# assign global vars here #}
{% set myReadonlyJar = your_custom_ext_twig_function() %} 
<html>
    <body>
        {% block body %}{% endblock %}
    </body>
</html>

my_page.树枝

{% extends 'stack/base.html.twig' %}
{% block body %}
    {{ myReadonlyJar.v1 }}
    {{ myReadonlyJar.v2 }}
    {{ include('stack/deep.twig') }}
{% endblock %}

深树枝

Check top vars very deep inside: <br>
{{ myReadonlyJar.v2 }}

Symfony 4 开始,您可以在 config/packages/twig.yaml 中设置全局变量。

# config/packages/twig.yaml
twig:
    # ...
    globals:
        ga_tracking: 'UA-xxxxx-x'

使用 SlimFrameworkTwig-View:3.0

您可以使用以下方法Twig::offsetSet

$twig = Twig::create('view/templates');
$twig->offsetSet('globalVar', 'globalVarValue');