带有FlashBag消息的RedirectResponse - Symfony2

时间:2015-04-19 08:36:24

标签: symfony session flash-message

我尝试在我的身份验证服务中使用RedirectResponse设置Flash消息以进行登录。

public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
    if($request->isXmlHttpRequest()) {
        return JsonResponse::create([
            'status' => false,
            'message' => $exception->getMessage(),
            'callback' => 'Login.failed'
        ]);
    } else {
        $session = new Session();
        $session->getFlashBag()->set('error', $exception->getMessage());

        var_dump($session->getFlashBag()->all()); die; // Works here.

        return new RedirectResponse('/login');
    }
}

嫩枝:

{{ dump(app.session.flashbag.all) }}

{% for message in app.session.flashbag.get('error') %}
    <div class="alert alert-danger">{{ message|trans }}</div>
{% endfor %}

树枝模板中没有留言......

我想知道,如果redirectresponse刷新所有flash消息?

2 个答案:

答案 0 :(得分:1)

Symfony无法神奇地获取所有Session实例并使用它。它只知道它自己创建的实例。那些住在Service Container。您应该从此容器中获取session服务,然后使用该服务。

由于您可能在服务中,因此您应该使用以下内容更新服务定义:

services:
    your_service:
        class: ...
        arguments: ["@session"]

现在,更新您的类以将会话服务保存在属性中:

// ...
use Symfony\Component\HttpFoundation\Session\Session;

// ...
class YourClassName
{
    private $session;

    public function __construct(Session $session)
    {
        $this->session = $session;
    }
}

现在,使用保存在属性中的会话实例:

// ...
public function onAuthenticationFailure(...)
{
    // ...
    $this->session->getFlashBag()->set('error', ...);

    // ...
}

答案 1 :(得分:1)

我解决了这个问题。在调用{{ dump(app.session.flashbag.all) }}后,你的flashbag变空了。

使用此代码:

{% for message in app.session.flashbag.get('error') %}
    <div class="alert alert-danger">{{ message|trans }}</div>
{% endfor %}

检查“如果...”不需要或你再次将flashbag弄空,一切正常。