如何使用和注册带有命名空间的Twig路径

3.4 版本
维护中的版本

通常,当你引用一个模板,你将要使用MyBundle:Subdir:filename.html.twig格式(请看:模板的命名和存储位置)。

Twig本身也提供了一个功能叫做“名称空间路径(namespaced paths)”,并自动为所有的bundle内置:

下面的路径便是一个例子:

1
2
{% extends "AppBundle::layout.html.twig" %}
{{ include('AppBundle:Foo:bar.html.twig') }}

使用命名空间路径,下面的工作是一样的:

1
2
{% extends "@App/layout.html.twig" %}
{{ include('@App/Foo/bar.html.twig') }}

两个路径都是有效的,并且这个功能在symfony中是默认的。

额外补充一点。使用经过命名空间声明的语法会运行得更快一些。

注册你自己的命名空间 

您也可以注册自己的自定义名称空间。假设你正在使用一些第三方库,他们包含存放在vendor/acme/foo-bar/templates的Twig模板。首先,为这个路径注册一个命名空间:

1
2
3
4
5
# app/config/config.yml
twig:
    # ...
    paths:
        "%kernel.root_dir%/../vendor/acme/foo-bar/templates": foo_bar
1
2
3
4
5
6
7
8
9
10
11
<!-- app/config/config.xml -->
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:twig="http://symfony.com/schema/dic/twig"
>
 
    <twig:config debug="%kernel.debug%" strict-variables="%kernel.debug%">
        <twig:path namespace="foo_bar">%kernel.root_dir%/../vendor/acme/foo-bar/templates</twig:path>
    </twig:config>
</container>
1
2
3
4
5
6
// app/config/config.php
$container->loadFromExtension('twig', array(
    'paths' => array(
        '%kernel.root_dir%/../vendor/acme/foo-bar/templates' => 'foo_bar',
    );
));

这个注册的命名空间被称为foo_bar,引用 vendor/acme/foo-bar/templates 目录。假设有一个名为sidebar.twig的文件在该目录,你就可以轻松地使用它:

1
{{ include('@foo_bar/sidebar.twig') }}

每个命名空间对应多个路径 

你也可以分配几个路径到相同的模板命名空间上。路径配置的顺序是非常重要的,因为Twig总是从第一个配置的路径开始,以此来推加载存在的第一个模板。当特定的模板不存在时,此功能可以作为一种回退机制来加载通用模板。

1
2
3
4
5
6
7
# app/config/config.yml
twig:
    # ...
    paths:
        "%kernel.root_dir%/../vendor/acme/themes/theme1": theme
        "%kernel.root_dir%/../vendor/acme/themes/theme2": theme
        "%kernel.root_dir%/../vendor/acme/themes/common": theme
1
2
3
4
5
6
7
8
9
10
11
12
<!-- app/config/config.xml -->
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:twig="http://symfony.com/schema/dic/twig"
>
 
    <twig:config debug="%kernel.debug%" strict-variables="%kernel.debug%">
        <twig:path namespace="theme">%kernel.root_dir%/../vendor/acme/themes/theme1</twig:path>
        <twig:path namespace="theme">%kernel.root_dir%/../vendor/acme/themes/theme2</twig:path>
        <twig:path namespace="theme">%kernel.root_dir%/../vendor/acme/themes/common</twig:path>
    </twig:config>
</container>
1
2
3
4
5
6
7
8
// app/config/config.php
$container->loadFromExtension('twig', array(
    'paths' => array(
        '%kernel.root_dir%/../vendor/acme/themes/theme1' => 'theme',
        '%kernel.root_dir%/../vendor/acme/themes/theme2' => 'theme',
        '%kernel.root_dir%/../vendor/acme/themes/common' => 'theme',
    ),
));

现在,你可以使用相同的 @theme 命名空间来引用前三个目录中的任何模板:

1
{{ include('@theme/header.twig') }}

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

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