Contributed by
Javier Eguiluz
in #21819.

Flash messages (消息条子)是指存在session中的“在你获取之后自行消失”的信息。它们常被用于对用户显示通知。在模板中以这种方式使用消息条子略显烦琐,因此我们决定在Symfony 3.3中简化它。

首先,得益于全新的 app.flashes helper,你毋须再深入到session对象中或操作 "flash bags" 来获取条子中的信息:

1
2
3
4
5
6
7
8
9
{# before / 之前 #}
{% for label, messages in app.session.flashbag.all %}
    ...
{% endfor %}
 
{# after / 之后 #}
{% for label, messages in app.flashes %}
    ...
{% endfor %}

再来,你可以过滤条子信息,只获取属于一或多个类型的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{# pass a string argument to get only the messages of that type #}
{# 传入一个字符串参数以便只获取该类型的信息 #}
{% for message in app.flashes('notice') %}
    <div class="alert alert-notice">
        {{ message }}
    </div>
{% endfor %}
 
{# pass an array argument to get the messages of those types  #}
{# 传入一个数组参数以便只获取(数组中的)那些类型的信息 #}
{% for label, messages in app.flashes(['warning', 'error']) %}
    {% for message in messages %}
        <div class="alert alert-{{ label }}">
            {{ message }}
        </div>
    {% endfor %}
{% endfor %}

最后,全新的模板助手修复了一个关于flash messages的最令人沮丧的问题:检查消息条子是否存在时会自动启动session。这也是为何你不得不首先要检查session是否存在。这种检查现在已经在内部完成,因此你不必再关注它,而session永不再自动启动了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{# before / 之前 #}
{% if app.session is not null and app.session.started %}
    {% for label, messages in app.session.flashbag.all %}
        {% for message in messages %}
            ...
        {% endfor %}
    {% endfor %}
{% endif %}
 
{# after / 之后 #}
{% for label, messages in app.flashes %}
    {% for message in messages %}
        ...
    {% endfor %}
{% endfor %}