Session Symfony2闪存信息未清除

Session Symfony2闪存信息未清除,session,symfony,flash-message,Session,Symfony,Flash Message,我第一次尝试在Symfony2应用程序中设置并显示一条flash消息。正在设置的闪存信息在第一次显示时不会被清除 我在控制器操作中设置了一条闪光消息: public function startAction() { if (!$this->hasError()) { $this->get('session')->setFlash('test_start_error', ''); return $this->redirect($thi

我第一次尝试在Symfony2应用程序中设置并显示一条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消息会在请求后再次显示。通过
var_dump($this->get('session')->getFlashBag()检查相关会话数据显示flash内容仍保留在会话中

我的印象是,一条显示过一次的闪光信息会从会话中删除。这对我来说是不可能的

很明显我做错了什么事

 app.session.hasFlash('test_start_error')
这实际上不会破坏flash消息,下一部分会

 {{ app.session.flash('test_start_error') }}
换句话说,您需要实际使用flash消息,否则它将被销毁。你刚刚检查了它是否存在

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

“has”方法:

实际获取方法:

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中,闪存行为不同。无论是否使用,每次请求都会持续闪烁。或者至少在浏览并在本地测试之后,我有了这样的印象

EDIT2:

哦,是的,在你的情况下,如果现在还不明显的话,实际的解决方法是在if语句中使用removeFlash,如下所示:

{% if app.session.hasFlash('test_start_error') %}
    error content here
    {{ app.session.removeFlash('test_start_error') }}
{% endif %}
多亏了康托夫拉特,他还押我说我还没有为给定的问题提供解决方案。:)


p.S.removeFlash方法在v2.1中被弃用,将从v2.3中删除。无论如何,如果您查看Session类内部,您可以看到它的行为就像中间人从FlashBag类调用get方法一样,而该方法实际上执行删除操作。

您是否实际使用了app.Session.flash的flash消息(“test\u start\u error”)?请你也在
会话
类中发布相应方法的链接,好吗?@thecatoneflat我编辑了这篇文章。您能确认两个symfony版本之间的不同闪存行为吗?因为在我看来这是一个很大的不同,而且我还没有看到sym的一些通知。开发团队。我不确定行为上的差异,但我确信您必须进一步扩展您的答案,提供调用和调用的选项。P.S.向上投票;)第二次编辑。谢谢你的提醒和投票:)
{% if app.session.hasFlash('test_start_error') %}
    error content here
    {{ app.session.removeFlash('test_start_error') }}
{% endif %}