在Twig文件之间导入内容

sis*_*sko 3 php import symfony twig

我怎么能有一个Twig文件从同一个或子目录中的第二个Twig文件中导入一些内容?

我正在开发一个项目,其中多个Twig文件有共同的内容,我试图避免在Twig文件之间复制和粘贴内容.

所以,我希望有一个包含共享标记的子目录,只需"导入"到主Twig文件的相关部分.

import.list.html.twig放在与主Twig文件相同的目录中,我尝试了以下操作:

{% extends "::base.html.twig" %}

{% block title %}StockBundle:StockController:index{% endblock %}

{% block body %}
<h1>Welcome to the StockController:List page</h1>

{% for stock in stocks %}
    <div class='list'>
        <div class='each stock'>
            <span class='name'>{{ stock.name }}</span>
            <span class='desc'>{{ stock.description }}</span>
            <span class='balc'>{{ stock.balance }}</span>
            <span class='edit'>
                <a href="{{ path('stock_edit', {'id':stock.id}) }}">edit</a>
            </span>
        </div>
    </div>
{% endfor %}

{% include 'import.list.html.twig' %}

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

...但我收到以下错误:

Unable to find template "import.list.html.twig" in ::base.html.twig at line 10.
Run Code Online (Sandbox Code Playgroud)

Jas*_*man 5

当你include需要知道它所在的命名空间时.当你这样做::{% extends "::base.html.twig" %},它来自app/Resources/views你的应用程序目录.

请参阅:模板命名和位置Symfony文档

如果你import.list.html.twig是一个捆绑包,你必须正确定义.例如,如果您拥有StockBundle并且该捆绑包中的Resources/views目录具有自己的base.html.twig模板,那么您将拥有

{% include 'StockBundle::base.html.twig' %}
Run Code Online (Sandbox Code Playgroud)

如果你有一个Stock包里面的Stock文件夹(附在你的StockController上)和一个import.list.html.twig模板,你就可以

{% include 'StockBundle:Stock:import.list.html.twig' %}
Run Code Online (Sandbox Code Playgroud)

请注意,通过Registered Namespaced Twig Paths,您也可以使用命名空间路径.它们实际上也更快.所以上面反而是

{% include '@Stock/base.html.twig' %}
{% include '@Stock/Stock/import.list.html.twig' %}
Run Code Online (Sandbox Code Playgroud)

这是Symfony模板最佳实践的另一个很好的参考

注意

从Symfony 2.2开始,您可以使用该include() 函数,这是包含模板的首选方法:

{{ include('@Stock/base.html.twig') }}
{{ include('@Stock/Stock/import.list.html.twig') }}
Run Code Online (Sandbox Code Playgroud)