如何注入变量到所有的模板(全局Twig变量)

3.4 版本
维护中的版本

有时候,你希望变量能够进入你所使用的所有模板。在你的app/config/config.yml文件中设置就可以做到:

1
2
3
4
5
# app/config/config.yml
twig:
    # ...
    globals:
        ga_tracking: UA-xxxxx-x
1
2
3
4
5
<!-- app/config/config.xml -->
<twig:config>
    <!-- ... -->
    <twig:global key="ga_tracking">UA-xxxxx-x</twig:global>
</twig:config>
1
2
3
4
5
6
7
// app/config/config.php
$container->loadFromExtension('twig', array(
     // ...
     'globals' => array(
         'ga_tracking' => 'UA-xxxxx-x',
     ),
));

现在,在所有的Twig模板中都可以使用ga_tracking 变量了:

1
<p>The google tracking code is: {{ ga_tracking }}</p>

非常容易!

使用服务容器参数 

你也可以利用内置的服务参数系统,他可以让你独立和重用这个值:

1
2
3
# app/config/parameters.yml
parameters:
    ga_tracking: UA-xxxxx-x
1
2
3
4
# app/config/config.yml
twig:
    globals:
        ga_tracking: '%ga_tracking%'
1
2
3
4
<!-- app/config/config.xml -->
<twig:config>
    <twig:global key="ga_tracking">%ga_tracking%</twig:global>
</twig:config>
1
2
3
4
5
6
// app/config/config.php
$container->loadFromExtension('twig', array(
     'globals' => array(
         'ga_tracking' => '%ga_tracking%',
     ),
));

这个相同的变量使用和以前一样。

引用服务 

除了使用静态值,您还可以将该值设置为服务。每当全局变量在模板中被访问,就从服务容器中请求服务,并获取该对象。

这个服务不会延迟加载。换句话说,当Twig一被加载,即使你从来都没使用过这个全局变量,您的服务也会被实例化。

要定义一个服务为全局Twig变量,字符串前缀应该为@。这应该感到熟悉,因为你在服务容器中也使用相同的语法。

1
2
3
4
5
# app/config/config.yml
twig:
    # ...
    globals:
        user_management: '@app.user_management'
1
2
3
4
5
<!-- app/config/config.xml -->
<twig:config>
    <!-- ... -->
    <twig:global key="user_management">@app.user_management</twig:global>
</twig:config>
1
2
3
4
5
6
7
// app/config/config.php
$container->loadFromExtension('twig', array(
     // ...
     'globals' => array(
         'user_management' => '@app.user_management',
     ),
));

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)