Symfony 细枝:无法覆盖';它在宏中定义

Symfony 细枝:无法覆盖';它在宏中定义,symfony,twig,Symfony,Twig,我正在从布局文件导入一个宏,在该宏中我定义了几个细枝块 在新的“视图”文件中扩展“基本”布局文件时,无法覆盖在宏中定义的块的内容 这里是我的用例的一个非常简化的最小版本 结构: 基部树枝 {% import 'macros' as macros %} <section> {{ macros.render_sections() }} {% block working %} content1-default {% endblock %} </

我正在从布局文件导入一个宏,在该宏中我定义了几个细枝块

在新的“视图”文件中扩展“基本”布局文件时,无法覆盖在宏中定义的块的内容

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

结构:

基部树枝

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

    {% block working %}
       content1-default
    {% endblock %}
</section>
{% macro render_sections() %}
    <section>
      {% block notworking %}
         content2-default
      {% endblock %}
    </section>
{% endmacro %}
{% extends "base" %}

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

{% block notworking %}
    content2-override
{% endblock %}
预期行为: 我希望在html中看到“content1覆盖content2覆盖”

实际发生的情况: 我看到“content1覆盖content2默认值”

是否有方法将块范围传递给宏

我曾尝试在base.twig文件中定义宏,以排除导入函数,但没有帮助。
很明显,其他一切都可以正常工作,因为我可以看到确实被覆盖的块。

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

  • 所有细枝文件都转换为PHP类

  • {%extends%}
    相当于普通PHP
    extends
    (用于继承)

  • {%import%}
    将上下文的属性分配给类型为“正在导入的细枝文件”的对象

  • 块只不过是php方法,本机php继承允许您轻松地覆盖细枝块

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

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();
类基{
公共功能显示(){
$context['macros']=新宏();
$context['macros']->render_sections();
回声';
echo$this->blockWorking();
回声';
}
公共功能模块化工作(){
回显“content1默认值”;
}
}
类宏{
公共职能部门{
回声';
echo$this->blockNotWorking();
回声';
}
公共功能块不工作(){
回应“内容2解除”;
}
}
类视图扩展了基{
公共功能模块化工作(){
回显“content1覆盖”;
}
公共功能块不工作(){
回显“content2覆盖”;
}
}
$view=新视图();
$view->display();

在这里,您可以清楚地看到view类的
blockNotWorking()
方法永远无法覆盖宏。

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

  • 所有细枝文件都转换为PHP类

  • {%extends%}
    相当于普通PHP
    extends
    (用于继承)

  • {%import%}
    将上下文的属性分配给类型为“正在导入的细枝文件”的对象

  • 块只不过是php方法,本机php继承允许您轻松地覆盖细枝块

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

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();
类基{
公共功能显示(){
$context['macros']=新宏();
$context['macros']->render_sections();
回声';
echo$this->blockWorking();
回声';
}
公共功能模块化工作(){
回显“content1默认值”;
}
}
类宏{
公共职能部门{
回声';
echo$this->blockNotWorking();
回声';
}
公共功能块不工作(){
回应“内容2解除”;
}
}
类视图扩展了基{
公共功能模块化工作(){
回显“content1覆盖”;
}
公共功能块不工作(){
回显“content2覆盖”;
}
}
$view=新视图();
$view->display();

在这里您可以清楚地看到,view类的
blockNotWorking()
方法永远无法覆盖宏。

即使它可以工作,我认为这将代表对宏的极大误用。为什么不能在主模板中溢出那些
{%block%}
语句呢?实际的用例是,我有一个嵌套的块名数组,我使用宏递归地迭代数组并呈现块{{block(array_item)}。因此宏本身更复杂,有for循环、if和递归。即使它可以工作,我认为这也代表了对宏的极大误用。为什么不能在主模板中溢出那些
{%block%}
语句呢?实际的用例是,我有一个嵌套的块名数组,我使用宏递归地迭代数组并呈现块{{block(array_item)}。因此宏本身更复杂,有for循环、if和递归。