php Twig可选命名空间模板

s4chpxco  于 12个月前  发布在  PHP
关注(0)|答案(1)|浏览(71)

在Twig中,是否可以使用命名空间模板路径(例如@admin/index.twig)仅在需要时?
我的设置看起来像这样:

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

当我们想使用extends关键字覆盖一个文件时,这就有问题了:

{# templates/navigation.twig #}

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

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

这显然会导致一个无限循环,因为它试图扩展自己。为了解决这个问题,我可以使用命名空间模板,例如。而不是extends 'templates/navigation.twig',我写extends '@dependency/templates/navigation.twig'(如果相应地配置了twig)。这个管用
但现在我需要将名称空间@dependency/添加到所有其他includeextends语句中,否则Twig将无法再找到模板。如果我这样做,templates/navigation.twig上面的模板将不再被调用,因为它不在@dependency/名称空间中。
怎么处理呢?

p4rjhz4m

p4rjhz4m1#

嗯,有时候输入问题会触发正确的想法。
我能够修复在多个命名空间中指定相同模板路径的问题:

// 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文档

相关问题