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

时间:2013-03-23 01:17:59

标签: php symfony 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消息并显示它是否存在?还是我坚持使用无用的循环?

4 个答案:

答案 0 :(得分: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 %}

答案 1 :(得分:4)

对于一条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 %}

答案 2 :(得分: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,而不是添加,$array[$key][] = $value这是导致数组进行字符串转换的原因,因为你传递的是数组,而不是字符串。

答案 3 :(得分:0)

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

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

...因为你不能保证总会有至少一条flash消息;)