所以这是用例:
Twig 2.2
symfony 3.2
在基本模板中,我只渲染一个 block ,如果它定义(不是'非空')
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
对于上述工作,根本无法定义 block (这是完全设计的)。无论如何,下面都会渲染 block ,我不知道为什么。
{% if not is_granted('IS_FULLY_AUTHENTICATED') %}
{% block left_sidebar %}
{% include ':blocks:block__login.html.twig' %}
{% endblock %}
{% endif %}
我想知道这是否因为与基本模板代码 相同的原因而不起作用工作。即 block 在运行前编译,条件语句在运行时执行。谁能确认我是对的?或者如果我错了请纠正我?
编辑
我尝试将条件的结果强制为真和假,并且在任何一种情况下都会呈现 block 。
最佳答案
Twig 将你的模板编译成 php 类,你可以在 symfony cache
中看到这些类。目录和 block 是这些类中的方法。这意味着 block 总是在编译时定义,像你这样的条件只确定它们是否被“执行”。
对于您的用例,我建议您调用 is_granted
在基本模板中。那么你就不需要包含任何 if
index.html.twig
中的元素因为如果从未使用过,定义侧边栏 block 将不起作用。
定义未使用的 block 并没有真正影响性能,因为 twig block 的解析只发生在编译时。例如,在 symfony 自己的表单组件中定义 block 是否被使用。
关于twig - 有条件地在 Twig 2 中定义一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42186007/