0

我在我的请求内核事件侦听器中设置了我的会话,我在其中更新了一个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 #}

所以我一直在测试的流程是这样的:

  1. 用户来到登录页面
  2. 提交登录表单(刷新登录路径)
  3. 登录被视为成功,重定向到另一个页面(假设页面 B)
  4. 等待十秒钟并刷新
  5. 内核事件应该清除会话并将项目添加到 flashbag
  6. 当到达页面 B 的路由的控制器时,它会检查会话以查看用户是否已登录,然后重定向到登录页面,因为他们没有
  7. 登录页面只是渲染树枝模板,看不到flash

这是否与文档中简要提到的 Flash 消息自动过期有关?

我怀疑这是一个简单的会话问题,可能会受到重定向和/或自动过期的影响。


编辑

我还尝试更改我的 onKernelRequest 函数,以便它为每个请求运行会话处理代码(已删除MASTER_REQUEST检查)


编辑 2

我已经尝试在我的侦听器和控制器中使用$session->setFlash('info', '...message...')而不是在我的模板中使用 #symfony IRC 频道中的建议,但仍然没有运气。$session->getFlashBag()->add(...)app.session.flashes('info')app.session.flashbag.get('info')

4

1 回答 1

0

这归结为 Symfony2.1 中的一个错误。

文档说该功能与 a then$session->invalidate()相同,但这并不是因为我的示例中的 flash 消息是在使用后者而不是第一个时显示的。$session->clear()$session->migrate()

请参阅 Symfony 的 Github 上的问题

于 2012-09-11T11:56:26.990 回答