Symfony2 Flash消息未清除

时间:2012-08-18 13:59:56

标签: session symfony flash-message

我第一次尝试在Symfony2应用程序中设置然后显示flash消息。第一次显示时,不会清除正在设置的闪存消息。

我在控制器操作中设置了一条flash消息:

public function startAction()
{
    if (!$this->hasError()) {
        $this->get('session')->setFlash('test_start_error', '');
        return $this->redirect($this->generateUrl('app', array(), true));
    }
}

在相应的视图中,如果设置了相关的闪存键,则会显示错误通知:

{% if app.session.hasFlash('test_start_error') %}
    error content here
{% endif %}

在正确的错误条件下,控制器会设置Flash消息,并在视图中显示相关的错误内容。

显示后,将在请求后再次显示Flash消息请求。通过var_dump($this->get('session')->getFlashBag());检查相关会话数据会显示Flash内容仍在会话中。

我的印象是,已经显示一次的Flash消息从会话中删除。这种情况不会发生在我身上。

显然我做错了什么 - 它是什么?

1 个答案:

答案 0 :(得分:5)

 app.session.hasFlash('test_start_error')

这实际上不会破坏flash消息,下一部分会

 {{ app.session.flash('test_start_error') }}

换句话说,你需要实际使用flash消息,而不是它会被破坏。你刚检查它是否存在。

编辑:根据thecatontheflat请求,以下是FlashBag(Symfony> 2.0.x)类的相应方法。

“有”方法:

public function has($type)
{
    return array_key_exists($type, $this->flashes) && $this->flashes[$type];
}

实际的get方法:

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

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

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

    return $return;
}

正如您所看到的那样,只有在您请求实际的Flash消息时,才会取消设置会话,而不是在您检查其存在时。

在Symfony 2.0.x中,闪​​存行为是不同的。对于一个请求,闪烁字面意义是否持续使用或不使用。或者至少在浏览the code并在本地测试后,我会留下这种印象。

EDIT2:

哦,是的,你的情况下的实际溶剂,如果现在不明显的话,就是在if语句中使用removeFlash:

{% if app.session.hasFlash('test_start_error') %}
    error content here
    {{ app.session.removeFlash('test_start_error') }}
{% endif %}

感谢thecatontheflat,为了重新发送我,我实际上没有为给定的问题提供解决方案。 :)

P.S。 removeVlash方法在v2.1中已弃用,将从v2.3中删除。无论如何,如果你看一下Session类,你会发现它只是像中间人那样从FlashBag类中调用get方法,而那个方法实际上就是删除。