我在我的请求内核事件监听器中设置了会话,我更新了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信息闪存消息设置为保持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 #}
所以我一直在测试的是:
这是否与documentation中简要提及的Flash消息自动过期有关?
我怀疑这是一个简单的会话问题,可能会受到重定向和/或自动过期的影响。
我也尝试更改我的onKernelRequest函数,以便它为每个请求运行会话处理代码(删除MASTER_REQUEST
检查)
我已经尝试在我的听众中使用$session->setFlash('info', '...message...')
代替$session->getFlashBag()->add(...)
&amp;在#symfony IRC频道中建议的模板中使用控制器和app.session.flashes('info')
代替app.session.flashbag.get('info')
,但仍然没有运气。
答案 0 :(得分:0)
documentation表示$session->invalidate()
函数与$session->clear()
然后$session->migrate()
相同,但不是因为我的示例中的flash消息在后者显示时显示使用但不是第一个。
请参阅Symfony的Github上的issue。