【问题标题】:Why is my flashbag item not there anymore?为什么我的 flashbag 物品不再存在?
【发布时间】:2012-09-07 15:58:11
【问题描述】:

我在请求内核事件侦听器中设置了会话,并在其中更新了一个 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 消息设置为保存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. 登录页面只是渲染twig模板,看不到flash

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

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


编辑

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


编辑 2

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

【问题讨论】:

  • 您是否有任何其他正在运行的任务可能会在这 10 秒窗口内触发此代码?心跳? '任何新'检查?
  • @MarcB 不,不这么认为。抱歉,什么?

标签: php session redirect symfony symfony-2.1


【解决方案1】:

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

documentation 表示$session-&gt;invalidate() 功能与$session-&gt;clear()$session-&gt;migrate() 相同,但这并不是因为我的示例中的 flash 消息在使用后者而不是第一个时显示。

在 Symfony 的 Github 上查看 issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2014-12-13
    相关资源
    最近更新 更多