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类
相当于普通PHP{%extends%}
(用于继承)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类
相当于普通PHP{%extends%}
(用于继承)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和递归。