有条件地在树枝 2 中定义一个块

conditionally define a block in twig 2

所以这是用例:

树枝 2.2
symfony 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,无论哪种情况都会呈现块。

Twig 将您的模板编译成 php 类,您可以在 symfony cache 目录中看到它,块是那些 类 中的方法。这意味着块总是在编译时定义,像你这样的条件只确定它们是否 "executed".

对于您的用例,我建议将对 is_granted 的调用放在基本模板中。那么您就不需要在 index.html.twig 中包含任何 if 元素,因为如果从未使用过,定义边栏块将没有任何效果。

定义未使用的块不会对性能造成真正的影响,因为 twig 块的解析只发生在编译时。定义块是否被使用,例如,在 symfony 自己的表单组件中。

所以,总结一下,因为它似乎是在一些地方发生的问题,我的怀疑是正确的,因为它是一个 compile/runtime 问题。

块被编译,因为 if 语句在运行时,一个无法控制另一个。

heres the github issue thread 如果有人需要更多信息。

如果没有输出或只有白色 space,block() 函数似乎 return 是一个假值,因此您可以将块包装在真实性测试和如果您不想显示子模板,请确保它为空。这样的事情对我有用:

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 %}