使用FlashBag消息重定向响应-Symfony2

使用FlashBag消息重定向响应-Symfony2,symfony,session,flash-message,Symfony,Session,Flash Message,我正在尝试在身份验证服务中设置一条带有重定向响应的Flash消息,以便登录 public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { if($request->isXmlHttpRequest()) { return JsonResponse::create([ 'status' => false,

我正在尝试在身份验证服务中设置一条带有重定向响应的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)}
{app.session.flashbag.get('error')%%中消息的%
{{message | trans}}
{%endfor%}
小枝模板中没有消息


我想知道redirectresponse是否会刷新所有flash消息?

Symfony无法神奇地获取所有会话实例并使用它们。它只知道自己创建的实例。那些人住在公园里。您应该从此容器中获取
会话
服务,并改用它

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

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

    // ...
}

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

使用此代码一次:

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

检查“如果…”不需要,或者您再次清空flashbag,一切正常。

我想这是由于创建了一个新的会话实例,您应该获取会话的现有实例,然后设置flash消息。不需要将@session注入服务。它与new Session()一起工作。它不工作,否则您不会创建此问题?@WouterJ虽然您是对的,这是解决方案,但是
SessionInterface
类型as参数是不正确的,因为它没有
getFlashBag()
方法,它只是实际使用的
Session
的本机实现,由于早期的错误/失败原因,您应该注入正确的类型。@R.CanserYanbakan您可以创建一个对象集,然后转储它。当然,这是同一个物体!在twig中,您使用来自不同服务容器的会话=>注入SessionTanks@Aitch。看得好一点的代码,我现在确实看到它不是接口的一部分,而只是实现的一部分(顺便说一句,这很难看)。我已经更新了答案
{% for message in app.session.flashbag.get('error') %}
    <div class="alert alert-danger">{{ message|trans }}</div>
{% endfor %}