如何访问base.html.twig中的peekAll()来检查消息/闪烁

时间:2018-10-26 14:28:30

标签: symfony twig

在symfony 4.1中

在控制器中:

$this->addFlash(
    'notice',
    'Your changes were saved!'
);
 return $this->render(...);

Twig基本模板:

{% for message in app.flashes('notice') %}
    <div class="flash-notice">
        {{ message }}
    </div>
{% endfor %}

这很好,但是我想将所有消息包装在div中。以下内容不起作用:

{% if app.flashes is not empty %}
  <div id="messageBox" class="overlay">
    <div class="message" onclick="slide(document.querySelector('#messageBox')); this.classList.add('fadeAway');">
      {% for label, messages in app.flashes %}
        <section class="{{ label }}">
          <p><b>{{ label }}</b></p>
          <ul>
            {% for message in messages %}
              <li>{{ message }}</li>
            {% endfor %}
          </ul>
        </section>
      {% endfor %}
    </div>
  </div>
{% endif %}

问题在于{% if app.flashes is not empty %}行删除了消息,因此以下for循环和空结果。

如何将peekAll()用于if逻辑?

2 个答案:

答案 0 :(得分:0)

我不知道这是否是最好的方法,但是以下是我的解决方法。

在base.html.twig中:

{% set flashes = app.flashes %}
{% if flashes is not empty %}
  <div id="messageBox" class="overlay">
    <div class="message" onclick="slide(document.querySelector('#messageBox')); this.classList.add('fadeAway');">
      {% for label, messages in flashes %}
        <section class="{{ label }}">
          <p><b>{{ label }}</b></p>
          <ul>
            {% for message in messages %}
              <li>{{ message }}</li>
            {% endfor %}
          </ul>
        </section>
      {% endfor %}
    </div>
  </div>
{% endif %}

基本上,将返回值app.flashes设置为flashes并进行处理。

答案 1 :(得分:0)

使用peekAll()进行检查的正确方法是{% if app.session.flashbag.peekAll() is not empty %},这不会按照文档清除FlashBag。