带有 FlashBag 消息的 RedirectResponse - Symfony2

RedirectResponse with FlashBag messages - Symfony2

我正在尝试在我的身份验证服务中设置带有 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 %}

twig 模板中没有消息...

我想知道,redirectresponse 是否刷新了所有的闪现消息?

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

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

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

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

// ...
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', ...);

    // ...
}

刚刚我解决了这个问题。调用 {{ dump(app.session.flashbag.all) }} 后你的闪光灯袋变空了。

使用一次此代码:

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

检查"if ..."不需要或者你再做一次flashbag清空,一切正常。