如何从父bundle中扩展twig模板?

3
我正在学习Symfony2,非常喜欢它(从ZendFramework 1.x迁移),但现在我遇到了twig模板方面的问题。您能指点我正确的方向吗?
我的应用程序有许多客户,每个客户都有一些自定义模板(大多数是模板,但也包括控制器等)。
我尝试通过bundle继承来实现这一点/我创建了一个ClientBundle,它继承自BaseBundle,保存所有基本的代码和模板...对于所有东西,都像我需要的那样工作,除了模板。当我在ClientBundle中创建模板时,它会覆盖BaseBundle中的模板,我无法从ClientBundle模板访问BaseBundle中的原始模板。我想扩展父模板,而不是覆盖它...这是不可能的吗?
谢谢!
2个回答

4

使用标准的Symfony extends 符号来引用父级bundle的模板会导致致命错误。由于bundle继承的原因,Symfony将您的模板引用解释为ChildBundle而不是BaseBundle,从而导致函数嵌套级别异常。

您可以直接使用以下符号引用父级bundle的模板文件:

{% extends "@Client/Foo/bar.html.twig" %}

替代:
{% extends "ClientBundle:Foo:bar.html.twig" %}

Twig的FilesystemLoader将引用字符串拆分为名称空间(Client)和路径(Foo/bar.html.twig)。名称空间是您包的名称,不包括后缀Bundle。每个名称空间的完整路径是通过将默认的<bundle_path>/Resources/views/与所提供的路径连接而解析出来的。

1
这是正确的解决方案。不需要虚拟/基础模板。 - Shira

1
Twig模板中扩展的标准命令是:
{% extends 'BaseBundle::yourTemplate.html.twig' %}

你可能在子bundle中使用了与模板相同的名称(你可能在父bundle和子bundle中都有yourTemplate.html.twig,因此子模板将覆盖父模板)。在这种情况下,你可以将子模板重命名为yourTemplate2.html.twig,然后从父模板扩展子模板。更多关于bundles继承和twig模板扩展的内容请参见: http://symfony.com/doc/current/cookbook/bundles/inheritance.html http://symfony.com/doc/current/book/templating.html


是的,我希望模板名称保持不变... 如果我更改名称,我还需要覆盖相应的操作并更改模板... 我正在寻找更优雅的解决方案。有什么方法吗? - Kamil Šrot
即使您覆盖了模板,仍然可以使用extend命令。您是否尝试在子模板中包含{% extends ... %}行? - iiirxs
1
是的,我做了。它以包含循环结束。即使我在扩展中使用父级捆绑名称,它也不包括父模板 :-( - Kamil Šrot
1
在这种情况下,您可以在子捆绑包中使用一个虚拟模板(tempTemplate.html.twig)来扩展父模板,然后在子yourTemplate.html.twig中扩展虚拟模板,或者更好的方法是在您的app/Resources/views文件夹中创建一个baseYourTemplate.html.twig模板,并从那里扩展父模板和子模板。 - iiirxs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接