为什么我的flashbag项目不再存在?

时间:2012-09-07 15:58:11

标签: php session redirect symfony symfony-2.1

我在我的请求内核事件监听器中设置了会话,我更新了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,但这永远不会显示。


我的Twig模板:

我知道这应该没有错,因为我在其他情况下会看到其他闪光。

{# 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. 登录页面只需渲染树枝模板,无法看到闪光

  8. 这是否与documentation中简要提及的Flash消息自动过期有关?

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


    修改

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


    编辑2

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

1 个答案:

答案 0 :(得分:0)

这是Symfony2.1中的一个错误。

documentation表示$session->invalidate()函数与$session->clear()然后$session->migrate()相同,但不是因为我的示例中的flash消息在后者显示时显示使用但不是第一个。

请参阅Symfony的Github上的issue