Macros 细枝-使用父模板中的宏

Macros 细枝-使用父模板中的宏,macros,import,twig,Macros,Import,Twig,假设我在macro.html.twig中有一个简单的宏: {% macro simple_macro() %} <h1>Simple macro</h1> {% endmacro %} {% extends 'layout' %} {% from 'simple_macro' import simple_macro %} {% block body %} {{ simple_macro() }} {% endblock %} {% from 'si

假设我在
macro.html.twig
中有一个简单的宏:

{% macro simple_macro() %}
    <h1>Simple macro</h1>
{% endmacro %}
{% extends 'layout' %}

{% from 'simple_macro' import simple_macro %}

{% block body %}
    {{ simple_macro() }}
{% endblock %}
{% from 'simple_macro' import simple_macro %}

{% block body %}{% endblock %}
和主文件
content.html.twig

{% macro simple_macro() %}
    <h1>Simple macro</h1>
{% endmacro %}
{% extends 'layout' %}

{% from 'simple_macro' import simple_macro %}

{% block body %}
    {{ simple_macro() }}
{% endblock %}
{% from 'simple_macro' import simple_macro %}

{% block body %}{% endblock %}
下面的代码可以工作,但是我有很多文件,比如
content.html.twig
,我不想在每个文件中复制/粘贴
{%from'simple\u macro'import simple\u macro%}
。所以我把这一行移到了
layout.html.twig

{% macro simple_macro() %}
    <h1>Simple macro</h1>
{% endmacro %}
{% extends 'layout' %}

{% from 'simple_macro' import simple_macro %}

{% block body %}
    {{ simple_macro() }}
{% endblock %}
{% from 'simple_macro' import simple_macro %}

{% block body %}{% endblock %}
但这会带来错误:

功能“简单宏”在“内容”中不存在。

我的问题是: 是否可以在父模板中导入宏并在子模板中使用它们


谢谢您抽出时间。

不,这是不可能的。宏必须导入到使用宏的特定文件中,这种行为是为了增加代码的详细性和可读性而设计的——如果在模板中使用大量的随机标记而不清楚它们的定义位置,那么生命就不会变得更加清晰。

使用
导入确实是可能的:

{% extends 'foo.html.twig' %}

{% import 'foo.html.twig' as foo %}

{% block content %}
    <div{{ foo.attributes(listAttributes) }}>
        {{ block('children') }}
    </div>
{% endblock %}
{%extends'foo.html.twig%}
{%import'foo.html.twig'作为foo%}
{%block content%}
{{block('children')}
{%endblock%}

这种行为称为继承。我还知道如何准备好模板树,并且不会导入大量不必要的标记。但谢谢你,这就是我问题的答案。这不是真正的继承——继承意味着用类似和/或相关的功能扩展功能。在模板引擎中,大多数人只需使用它将整个厨房水槽的神奇功能包含到核心
master.twig
中,并在500个其他模板中完成。在编程术语中,这不是继承,而是类似于将整个程序放在一个基类中——这也是一种糟糕的做法。类似地,在PHP/C++/C#/Java/etc中,扩展也并不意味着您使用包含的类中的
/
import
语句来获取
。您没有抓住要点。宏必须包含在foo.html.twig中,并且您不必在扩展模板中再次导入它。