所以这里是用例:
- 在动态页面结构中呈现登录表单块,但前提是用户未通过身份验证
- 如果未通过身份验证,则不得定义块(以保留动态页面结构)
树枝2.2
符号3.2
在基本模板中,我只在块定义(而不是"not emtpy")的情况下渲染块
base.html.twig
{% if block('left_sidebar') is defined %}
<div class="col-md-2">
{{- block('left_sidebar') -}}
</div>
<div class="col-md-10">
{% else %}
<div class="col-md-12">
{% endif %}
index.html.twig
对于以上工作,根本不能定义块(这是完全设计的)。下面的渲染块无论如何,我不知道为什么。
{% if not is_granted('IS_FULLY_AUTHENTICATED') %}
{% block left_sidebar %}
{% include ':blocks:block__login.html.twig' %}
{% endblock %}
{% endif %}
我想知道这是否不起作用,因为与基本模板代码起作用的原因相同。也就是说,块在运行时之前编译,条件语句在运行时执行。
谁能证实我是对的吗?或者如果我错了就纠正我?
编辑
我尝试过将条件的结果强制为true和false,在任何一种情况下都会渲染块。
因此,总结一下,由于这似乎是一个发生在少数地方的问题,我的怀疑是正确的,因为这是一个编译/运行时问题。
块是编译的,因为if语句是在运行时,所以一个不能控制另一个。
如果有人想了解更多信息,请访问github问题线程。
如果block()
函数中没有输出任何内容或只输出空白,则它似乎会返回一个false值,因此您可以在truthiness测试中包装块,如果不希望它显示,则在子模板中确保它为空。像这样的东西对我有用:
base.html.twig:
{% if block('left_sidebar') %}
<div class="col-md-2">
{% block left_sidebar %}{% endblock %}
</div>
<div class="col-md-10">
{% else %}
<div class="col-md-12">
{% endif %}
index.html.twig
{% block left_sidebar %}
{% if not is_granted('IS_FULLY_AUTHENTICATED') %}
{% include ':blocks:block__login.html.twig' %}
{% endif %}
{% endblock %}
Twig将模板编译为php类,您可以在symfonycache
目录中看到这些类,块是这些类中的方法。这意味着块总是在编译时定义的,而像您这样的条件语句只决定它们是否"执行"。
对于您的用例,我建议将对is_granted
的调用放在基本模板中。那么您就不需要在index.html.twig
中包含任何if
元素,因为如果从未使用侧边栏块,则定义侧边栏块将没有任何效果。
定义未使用的块并不会对性能造成真正的影响,因为只有在编译时才能解析分支块。定义块(无论是否使用)是在symfony自己的表单组件中完成的。