twig - 有条件地在 Twig 2 中定义一个 block

标签 twig symfony templating

所以这是用例:

  • 在动态页面结构中呈现登录表单 block ,但前提是用户未通过身份验证
  • 如果未通过身份验证,则不得定义 block (以保留动态页面结构)

  • 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/

    相关文章:

    jsf - 有条件地渲染 ui :define

    Symfony2 多枝扩展

    Symfony 4 Swift Mailer 不发送邮件

    php - 是否有用于 php 的纯 html 模板系统?

    sql - 再次数据库、表和列命名约定

    php - 从另一个 php 脚本访问 Symfony2 Session

    javascript - 如何使用 React 重写返回 jsp 页面的 struts 应用程序?

    php - "detailIndex"的 Twig 错误项目 "Array"不存在于

    javascript - ng 单击和/或 ng 更改

    php - 如何以 Twig 形式访问 $_POST?