Contributed by
Matt Brunt
in #24777.

Twig 支持 filters, functions, global variables 等的 overloading(译注:变量调节器/函数/全局变量,这都是twig模板中的标准功能,它们可以“过载”,即最迟加载)。这并非通常所需的功能,但它却在改变你程序中所使用的某些扩展的行为时有用。

过载那些元素时,需要把它们定义在一个新的 Twig extension 中,然后把这些扩展尽可能晚地注册,以便覆盖掉其他的扩展。当把 Twig 作为一个独立模板引擎来使用时(sf框架外使用),很容易控制“哪个扩展先被注册”。但是,在 Symfony 中,你并不需要控制这个顺序。

在 Symfony 4.1 中,若你要过载任何一个 Twig 元素,我们已经对“定义Twig扩展的优先级”进行了支持。这个优先级与框架其他部分的优先级用法是完全相同的: 优先级被定义为正或负的整数,存在于标签中 (本例中是 twig.extension) 的 priority 属性中:

1
2
3
4
5
6
7
8
9
# config/services.yaml
services:
    # ...
    App\Twig\AppExtension:
        public: false
        tags:
            # extensions with higher priorities are registered earlier
            # 愈高的优先级则愈早被注册
            - { name: twig.extension, priority: -1024 }

唯一要注意的是当你定义优先级时,不可以依赖于 service autoconfiguration(服务的自动注册)而且必须把 Twig extension 显式地注册为服务并指派其 priority 属性的值。