我在我的请求内核事件侦听器中设置了我的会话,我在其中更新了一个last_seen
会话变量,如下所示:
class RequestListener
{
public $session;
public function __construct( Session $session ) {
//leave blank
$this->session=$session;
}
public function onKernelRequest( GetResponseEvent $event ) {
if ( HttpKernel::MASTER_REQUEST != $event->getRequestType() ) {
// don't do anything if it's not the master request
return;
}
else {
$session = $this->session;
$current_time = time();
//if they're logged in and it hasn't been more than an hour since their last request
if ( $session->get( 'auth' ) ) {
if ( ( (int) $session->get( 'last_seen' ) ) > ( $current_time - 10 ) ) {//timeout: half hour (temporarily changed to ten seconds)
//regenerate session ID:
$session->migrate();
}
else {
//destroy session
$session->invalidate();//shortcut for clear() & then migrate()
//set session variable to acknowledge timeout
$session->getFlashBag()->add( 'info', 'You were automatically logged out due to inactivity' );
}
$session->set( 'last_seen', $current_time );
}
else {
$session->set( 'last_seen', $current_time );
}
}
}
}
为每个请求运行此代码。如您所见, flashbag info flash 消息设置为 hold You were automatically logged out due to inactivity
,但这永远不会显示。
我的树枝模板:
我知道这应该没有什么问题,因为我在其他情况下看到其他闪光。
{# START info messages #}
{% set info_messages = app.session.flashbag.get('info') %}
{% if info_messages is defined and info_messages is not empty%}
<div class="row alert alert-info alert-block">
<ul>
{% for info_message in info_messages %}
<li>{{info_message | raw}}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{# END info messages #}
所以我一直在测试的流程是这样的:
- 用户来到登录页面
- 提交登录表单(刷新登录路径)
- 登录被视为成功,重定向到另一个页面(假设页面 B)
- 等待十秒钟并刷新
- 内核事件应该清除会话并将项目添加到 flashbag
- 当到达页面 B 的路由的控制器时,它会检查会话以查看用户是否已登录,然后重定向到登录页面,因为他们没有
- 登录页面只是渲染树枝模板,看不到flash
这是否与文档中简要提到的 Flash 消息自动过期有关?
我怀疑这是一个简单的会话问题,可能会受到重定向和/或自动过期的影响。
编辑
我还尝试更改我的 onKernelRequest 函数,以便它为每个请求运行会话处理代码(已删除MASTER_REQUEST
检查)
编辑 2
我已经尝试在我的侦听器和控制器中使用$session->setFlash('info', '...message...')
而不是在我的模板中使用 #symfony IRC 频道中的建议,但仍然没有运气。$session->getFlashBag()->add(...)
app.session.flashes('info')
app.session.flashbag.get('info')