3

我第一次尝试在 Symfony2 应用程序中设置并显示一条 Flash 消息。正在设置的闪烁消息在第一次显示后不会被清除。

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

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

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

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

在正确的错误条件下,控制器设置闪烁消息,并在视图中呈现相关的错误内容。

一旦显示,flash 消息会在请求后再次显示。通过检查相关会话数据可以var_dump($this->get('session')->getFlashBag());发现 flash 内容仍保留在会话中。

我的印象是从会话中删除了一条已显示过一次的 Flash 消息。这不会发生在我身上。

很明显我做错了什么——这是什么?

4

1 回答 1

5
 app.session.hasFlash('test_start_error')

这实际上并没有破坏 Flash 消息,下一部分会

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

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

编辑:根据 catontheflat 请求,这里是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;
}

如您所见,它仅在您请求实际的闪存消息时才取消设置会话,而不是在您检查它是否存在时。

在 Symfony 2.0.x 中,闪存行为是不同的。闪烁实际上持续一个请求,无论是否使用。或者至少我在浏览代码并在本地测试后有这种印象。

编辑2:

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

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

感谢 thecatontheflat,提醒我我实际上并没有为给定的问题提供解决方案。:)

PS removeFlash 方法在 v2.1 中已弃用,将从 v2.3 中删除。无论如何,如果您查看 Session 类,您会发现它只是像中间人一样从 FlashBag 类调用 get 方法,而该方法实际上执行了删除操作。

于 2012-08-18T15:22:47.223 回答