在Twig中导入包含常量的文件?

时间:2014-04-22 13:29:22

标签: symfony twig

是否可以在另一个twig文件中导入带有一堆常量的文件?

如:

{% set VAR1 = constant("...:var1") %}
{% set VAR2 = constant("...:var2") %}
{% set VAR3 = constant("...:var3") %} 
...

然后,在另一个文件中使用这些常量?

我尝试过includeimportuseembed。 这些似乎都不适合这种情况。

2 个答案:

答案 0 :(得分:1)

按照设计,您无法从其他上下文导入变量,因为没有参数的{% include %}将通过副本而非参考传递您当前的上下文。

这与{% macro %}变量作为参数的_context完全相同,因此您无法在宏内部创建新变量,然后在任何位置{% import %}创建宏文件

但是,您可以从扩展文件创建变量,并在子文件中使用它们。

例如:

a.html.twig

{% set test = 'Hello!' %}

b.html.twig

{% extends 'a.html.twig' %}
{{ test }}

将显示"您好!"渲染b.html.twig时,或任何其他扩展a.html.twig的文件。

如果按照设计,您无法在应用中扩展父模板,则可以创建Twig扩展并实施getGlobals()方法(doc)

示例(对我来说,在Fuz / TestBundle中,替换所有名称空间以满足您的需求):

Twig扩展名:

PHP Fuz / TestBundle / Twig / Extension / AppGlobalsExtension.php

<?php

namespace Fuz\TestBundle\Twig\Extension;

class AppGlobalsExtension extends \Twig_Extension
{

    public function getGlobals()
    {
        return array(
            'var1' => \Fuz\TestBundle\Component\Service::SOME_CONSTANT_A,
            'var2' => \Fuz\TestBundle\Component\Service::SOME_CONSTANT_B,
            'var3' => \Fuz\TestBundle\Component\Service::SOME_CONSTANT_C,
            // ...
        );
    }

    public function getName()
    {
        return 'appglobals';
    }

}

配置:

YML Fuz / TestBundle / Resources / config / services.yml

parameters:
    fuz_tools.twig.appglobals_extension.class: Fuz\TestBundle\Twig\Extension\AppGlobalsExtension

services:
    fuz_tools.twig.appglobals:
        class: '%fuz_tools.twig.appglobals_extension.class%'
        tags:
          - { name: twig.extension }

您现在可以在应用程序视图中的任何位置使用{{ var1 }}{{ var2 }} ....

答案 1 :(得分:0)

这应该为你做到了(使用with),只需传递变量:

{% include "ACMETestBundle::test.html.twig" with {var1: VAR1, var2: VAR2, ... } %}