Symfony2 -带flash消息的数组到字符串转换异常


Symfony2 - Array to string conversion exception with a flash message

我在控制器中设置了一个flash消息,代码如下:

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

效果很好。我不想在这里使用循环,因为我只会有一个消息,或者没有。

是否有一个解决方案,我可以检查是否存在单个flash消息并显示它,如果它在那里?还是说我陷入了一个无用的循环?

通过在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 %}

对于一个flash消息:

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

我自己也碰到了。这是因为我使用的是add()方法而不是set()

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这会导致数组到字符串的转换因为你传递的是数组,而不是字符串

好的,我知道你已经自己解决了这个问题,但这可能是一个更简单的方法:

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

…因为你不能保证至少会有flash消息;)