9

我使用以下代码在控制器中设置了一条闪存消息:

$this->get('session')->getFlashBag()->add('success', 'Message sent successfully');

在我的模板中,我使用以下内容(尝试)显示它:

{% if app.session.flashbag.has('success') %}
    <div id="flash">
        {{ app.session.flashbag.get('success') }}
    </div>
{% endif %}

问题是,尽管 API 文档说明get返回一个字符串,但我得到了一个数组到字符串的转换异常。如果我将模板中的代码更改为:

{% for flashMessage in app.session.flashbag.get('success') %}
    <div id="flash">
        {{ flashMessage }}
    </div>
{% endfor %}

它完美地工作。我宁愿不在这里使用循环,因为我要么只会收到一条消息,要么不会。

有没有一种解决方案,我可以检查是否存在单个闪存消息并在存在时显示它?还是我陷入了无用的循环?

4

4 回答 4

11

通过在 0 处索引来解决它:

{{ app.session.flashbag.get('success')[0] }}

我的怀疑是正确的——get返回一个数组而不是一个字符串。这是flashbag的add方法:

public function add($type, $message)
{
    $this->flashes[$type][] = $message;
}

并且get

public function get($type, array $default = array())
{
    if (!$this->has($type)) {
        return $default;
    }

    $return = $this->flashes[$type];

    unset($this->flashes[$type]);

    return $return;
}

他们需要修复 API 文档,使其反映现实。它们还应该提供一种优雅的方式来处理单个 Flash 消息。

编辑:向后兼容(PHP 5.3 及以下)版本 -

{% if app.session.flashbag.has('success') %}
    {% set flashbag = app.session.flashbag.get('success') %}
    {% set message = flashbag[0] %}
    <div id="flash">
        {{ message }}
    </div>
{% endif %}
于 2013-03-23T01:43:17.763 回答
4

对于一条闪光信息:

{{ app.session.flashbag.get('success')[0] }}

对所有人:

{% for type, messages in app.session.flashbag.all() %}
    {% for message in messages %}
        <div class="alert alert-{{ type }}">
            {{ message }}
        </div>
    {% endfor %}
{% endfor %}
于 2013-03-23T12:59:26.197 回答
1

我自己刚打过这个。这是因为我使用的是add()方法而不是set().

添加和设置的区别:

public function add($type, $message)
{
    $this->flashes[$type][] = $message;
}

以上将添加一个在这种情况下不需要的额外数组。

然而:

public function set($type, $messages)
{
    $this->flashes[$type] = (array) $messages;
}

所以set()结果$array[$key] = $value,而不是 add 做什么,这$array[$key][] = $value就是导致你的 Array 到字符串转换的原因,因为你传递的是一个数组,而不是一个字符串。

于 2015-10-08T11:35:50.653 回答
0

OK, I see that you have resolved this issue by yourself but this might be an easier way:

{% if app.session.hasFlash('success') %}
    {{ app.session.flash('success') }}
{% endif %}

... since you can't guarantee that there will always be at least flash message ;)

于 2013-03-23T07:35:36.420 回答