Symfony版本: 5.1.8
当使用表单验证器AbstractFormLoginAuthenticator时,方法onAuthenticationSuccess输出重定向。在此重定向之后,我想为成功登录的用户显示一条成功的消息。
在这个用例中使用来自身份验证器的flashbag会很好,这就是我通过注入Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface来利用服务session.flash_bag实现的。与以下内容结合:
$this->flashbag->set('login_successfull', 'message_login_form_valid');它起作用了。
但是在升级到Symfony 5.1之后,我发现了这个弃用:
User Deprecated: Since symfony/framework-bundle 5.1: The "session.flash_bag" service is deprecated, use "$session->getFlashBag()" instead.我试图通过使用$flashbag = $request->getSession()->getBag('flash')来解决这个问题,但我不能让它工作,因为$flashbag上没有设置消息的方法(只有getName、getStorageKey、clear或initialize)。
我也尝试注入可用的自动连接session服务,但它来自SessionInterface,它不能让您以我上面提到的相同方式检索和设置flashbag。
也许我看错了,你有什么建议来解决这个用例吗?我想过放弃使用flashbag的想法,但我看不到在重定向后传递信息的好方法?
发布于 2020-11-11 03:10:35
如果您查看AbstractController的$this->addFlash方法,您可以找到默认用于添加新flash消息的服务。所以你的代码应该是这样的:
$this->session->getFlashBag()->add($type, $message);其中,$this->session属性是:Symfony\Component\HttpFoundation\Session\SessionInterface的实例
发布于 2020-11-11 06:28:46
我想我会在这里发布这篇文章,只是因为它有点神秘。
SessionInterface::getFlashBag不存在。
getFlashBag确实存在,并返回一个包含add/set方法的FlashBagInterface。
奇怪的是,PHPStorm不会抱怨使用接口中未定义的方法。
class SomeService
{
private SessionInterface $session;
public function __construct(SessionInterface $session)
{
$this->session = $session;
}
public function doSomething()
{
// For some reason PHPStorm accepts this
/** @var FlashBagInterface $flashBag */
$flashBag = $this->session->getFlashBag();
$flashBag->add('flash','me');
}
}即使在代码帮助菜单中没有列出getFlashBag,上面的代码也可以正常工作,而不会出现警告。我必须知道它在那里,并输入全名。即使PHPStorm知道该方法返回一个FlashBagInterface,我仍然必须添加var映射才能使方法出现在$flashBag上。这一切都非常令人困惑。
我预计会话接口问题将在下一个版本中得到解决。
事实证明,在几年前的这个数据上有几个github问题。已决定不实施“修复”。主要是BC问题。
https://stackoverflow.com/questions/64775080
复制相似问题