Twig:无法覆盖宏中定义的块

Rod*_*dik 1 symfony twig

我从布局文件导入一个宏,并在该宏内部定义了几个树枝块.

当我在新的"视图"文件中扩展"基础"布局文件时,我无法覆盖我在宏中定义的块的内容.

这是我的用例的一个非常简化的最小版本.

结构体:

base.twig

{% import 'macros' as macros %}
<section>
    {{ macros.render_sections() }}

    {% block working %}
       content1-default
    {% endblock %}
</section>
Run Code Online (Sandbox Code Playgroud)

macro.twig

{% macro render_sections() %}
    <section>
      {% block notworking %}
         content2-default
      {% endblock %}
    </section>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

view.twig

{% extends "base" %}

{% block working %}
   content1-override
{% endblock %}

{% block notworking %}
    content2-override
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

预期的行为:我希望在我的html中看到"content1-override content2-override".

实际发生的事情:我看到'content1-override content2-default'

有没有办法将块范围传递给宏?

我已经尝试在base.twig文件中定义宏,以排除导入功能,但这没有帮助.显然其他一切都有效,因为我可以看到被覆盖的块.

Ala*_*blo 9

你应该了解Twig的内部结构:

  • 所有Twig文件都转换为PHP类

  • {% extends %}是等效的PHP extends(用于继承).

  • {% import %} 将上下文的属性分配给"您正在导入的twig文件"类型的对象

  • 块只不过是php方法,本机的php继承让你可以甜蜜地覆盖Twig块.

因此,考虑到这一点,您转换的树枝代码将如下所示:

class base {

   public function display() {
      $context['macros'] = new macros();
      $context['macros']->render_sections();
      echo '<section>';
      echo $this->blockWorking();
      echo '</section>';
   }

   public function blockWorking() {
     echo "content1-default";
   }

}

class macros {

  public function render_sections() {
     echo '<section>';
     echo $this->blockNotWorking();
     echo '</section>';
  }

  public function blockNotWorking() {
     echo "content2-defualt";
  }

}

class view extends base {

   public function blockWorking() {
     echo "content1-override";
   }

   public function blockNotWorking() {
     echo "content2-override";
   }

}

$view = new view();
$view->display();
Run Code Online (Sandbox Code Playgroud)

你可以在这里清楚地看到,blockNotWorking()视图类的方法不能永远不会覆盖宏的方法.