Как использовать и регистрировать пути Twig с пространством имён

Как использовать и регистрировать пути Twig с пространством имён

Обычно, когда вы ссылаетесь на шаблон, вы используете формат MyBundle:Subdir:filename.html.twig (смотрите Локации именования шаблонов).

Twig также предлагает функцию под названием "пути с пространством имён", и их поддержка автоматически встроена для всех ваших пакетов.

Возьмите следующие пути в качестве примера:

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 по умолчанию.

Tip

В качестве дополнительного бонуса: синтаксис пространста имён быстрее.

Регистрация ваших собственных пространств имён

Вы также можете зарегистрировать ваши собственные пользовательские пространства имён. Представьте, что вы используете некоторую стороннюю библиотеку, которая включет шаблоны Twig, находящиеся в vendor/acme/foo-bar/templates. Для начала, зарегистрируйте прострнаство имён для этого каталога:

  • YAML
    1
    2
    3
    4
    5
    # app/config/config.yml
    twig:
        # ...
        paths:
            '%kernel.project_dir%/vendor/acme/foo-bar/templates': foo_bar
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <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"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <twig:config debug="%kernel.debug%" strict-variables="%kernel.debug%">
            <twig:path namespace="foo_bar">%kernel.project_dir%/vendor/acme/foo-bar/templates</twig:path>
        </twig:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    // app/config/config.php
    $container->loadFromExtension('twig', array(
        'paths' => array(
            '%kernel.project_dir%/vendor/acme/foo-bar/templates' => 'foo_bar',
        ),
    ));
    

Зарегистрированное пространство имён называется foo_bar и ссылается на каталог vendor/acme/foo-bar/templates. Если предположить, что в этом каталоге есть файл под названием sidebar.twig, вы можете с лёгкостью его использовать:

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

Множественные пути для одного пространства имён

Вы также можете назначить несколько путей одному и тому же пространству имён шаблона. Порядок, в котором конфигурируются пути, очень важен, так как Twig будет всегда загружать первый существующий шаблон, начиная с первого сконфигурированного пути. Эта функция может быть использована в качестве механизма отката для загрузки общих шаблонов при отсутствии специального шаблона.

  • YAML
    1
    2
    3
    4
    5
    6
    7
    # app/config/config.yml
    twig:
        # ...
        paths:
            '%kernel.project_dir%/vendor/acme/themes/theme1': theme
            '%kernel.project_dir%/vendor/acme/themes/theme2': theme
            '%kernel.project_dir%/vendor/acme/themes/common': theme
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <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"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <twig:config debug="%kernel.debug%" strict-variables="%kernel.debug%">
            <twig:path namespace="theme">%kernel.project_dir%/vendor/acme/themes/theme1</twig:path>
            <twig:path namespace="theme">%kernel.project_dir%/vendor/acme/themes/theme2</twig:path>
            <twig:path namespace="theme">%kernel.project_dir%/vendor/acme/themes/common</twig:path>
        </twig:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    // app/config/config.php
    $container->loadFromExtension('twig', array(
        'paths' => array(
            '%kernel.project_dir%/vendor/acme/themes/theme1' => 'theme',
            '%kernel.project_dir%/vendor/acme/themes/theme2' => 'theme',
            '%kernel.project_dir%/vendor/acme/themes/common' => 'theme',
        ),
    ));
    

Тепер вы можете использовать одно пространство имён @theme, чтобы ссылаться на любой шаблон, находящийся в трёх предыдущих каталогах:

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.