如何在Twig模板文件中定义全局变量?

17

在twig文件中设置全局变量,以便我可以从其他文件、宏和块中访问这些变量,这是否可能。

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

我知道可以通过框架(例如Symfony)设置全局变量,但我想使用twig功能来解决这个问题。


可能是重复的问题:Symfony 2 + Twig全局变量 - BENARD Patrick
4个回答

37

使用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模板

当您包含一段Twig代码时,实际上只包含来自该代码的渲染视图,而不是代码本身。因此,按照设计,无法以您所寻找的方式包含一组变量。


如果我使用第二种方法,我需要像 $_SESSION 一样设置一次并在整个应用程序中保留它吗?还是每次初始化 Twig 都需要这样做? - garek007
你不能直接从Twig调用一个函数吗(例如{{ function('do_global_things') }}),并在函数中访问全局变量吗?我只是粗略地浏览了问题和答案,所以可能有些遗漏。 - Joel M
@JoelM,你可以这样做,但它会破坏Twig的通用设计,并且几乎不安全。这就像在PHP中编写HTML一样美丽。 - Alain Tiemblo

1
似乎你可以在顶级模板中分配全局的只读变量,并在所有下层模板中使用它们。但是你当然不能覆盖它们。 这符合我的情况,可能对其他人有用。

base.html.twig

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

my_page.twig

{% extends 'stack/base.html.twig' %}

{% block body %}
    {{ myReadonlyJar.v1 }}

    {{ myReadonlyJar.v2 }}
    {{ include('stack/deep.twig') }}
{% endblock %}

deep.twig

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

1
自从Symfony 4以来,您可以在config/packages/twig.yaml中设置全局变量。
# config/packages/twig.yaml
twig:
    # ...
    globals:
        ga_tracking: 'UA-xxxxx-x'

0

使用 SlimFrameworkTwig-View:3.0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接