Как использовать и регистрировать пути 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.