使用FlashBag消息重定向响应-Symfony2
我正在尝试在身份验证服务中设置一条带有重定向响应的Flash消息,以便登录使用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,
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 %}