Twig 可选命名空间模板

Twig optionally namespaced templates

提问人:Michael Bolli 提问时间:6/20/2023 更新时间:6/20/2023 访问量:50

问:

在 Twig 中,是否有可能仅在需要时使用命名空间模板路径(例如)?@admin/index.twig

我的设置如下所示:

  • 项目 X 有一个目录template
  • 项目 X 有一个依赖项 Y,它有另一个目录template
  • Twig 设置了两个目录作为模板路径(首先是项目 X,然后是依赖项 Y)
  • 如果项目 X 想要覆盖依赖项 Y 提供的模板(例如,它只需要在自己的目录中创建模板vendor/company/dependencyY/templates/navigation.twigtemplates/navigation.twig

当我们想使用关键字覆盖文件时,它会有问题:extends

{# templates/navigation.twig #}

{% extends 'templates/navigation.twig' %}
{# meant to extend the dependency's template #}

{% block javascript %}
  {{ parent() }}
  <script src="...">
{% endblock %}

这显然会导致无限循环,因为它试图扩展自己。为了解决这个问题,我可以使用命名空间模板,例如,而不是我写(如果相应地配置了 twig)。这行得通。extends 'templates/navigation.twig'extends '@dependency/templates/navigation.twig'

但是现在我需要将命名空间添加到所有其他语句中,否则 Twig 将不再找到模板。如果我这样做,上面的模板将不再被调用,因为它不在命名空间中。@dependency/includeextendstemplates/navigation.twig@dependency/

如何处理?

PHP 命名空间 twig

评论


答:

0赞 Michael Bolli 6/20/2023 #1

好吧,有时输入问题会触发正确的想法。

我能够解决在多个命名空间中指定相同模板路径的问题:

// register the directories with no namespace
$loader->addPath(__DIR__ . DIRECTORY_SEPARATOR . 'templates');
$loader->addPath(DEPENDENCY_DIR . DIRECTORY_SEPARATOR . 'templates');

// register the dependency directory with a namespace
$loader->addPath(DEPENDENCY_DIR . DIRECTORY_SEPARATOR . 'templates', 'dependency');

这允许两者以及 .或者引用这个问题:.include "dependency_template.twig"include "@dependency/dependency_template.twig"@dependency/templates/navigation.twig

Twig 文档