【问题标题】:Upgrade Symfony from 2.1 to 2.3 : where session is started?将 Symfony 从 2.1 升级到 2.3:会话从哪里开始?
【发布时间】:2014-03-21 09:45:43
【问题描述】:

我是 Symfony 2.1 中的一个 symfony 项目

当我迁移到 2.3 时,似乎之前有一个服务启动了会话。 所以我的代码无法修复会话 ID。

有没有办法找到之前哪个服务使用会话?

【问题讨论】:

  • 没有方法setId 做你想做的事吗? Session api
  • 没有。我收到“无法更改活动会话的 ID”错误。如果我删除带有 setId() 的行,我会收到“无法启动会话:已经由 PHP 启动($_SESSION 是 iset)”错误。
  • php.ini中设置session.auto_start = 0
  • @forgottenbas 已经完成(并且默认完成)。我很确定我们使用的捆绑包之一和/或导致这样做。但我不知道如何找到它(以及在哪里)......特别是因为这是由于 symfony 2.3(和/或我们对 2.3 所做的修改),因为我在使用 symfony 2.1 时没有遇到这个问题
  • 您在哪一刻修改了会话?

标签: php session symfony migration symfony-2.3


【解决方案1】:

我不知道答案,但我的想法是创建一个请求侦听器,将其优先级设置为高值,并尝试在那里设置 id。例如:

services.yml

request_listener:
    class:  My\Bundle\Service\Listener\RequestListener
    arguments: [ @session]       
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 9 }

和请求监听器:

use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class RequestListener
{
    protected $session;

    function __construct(Session $session)
    {
        $this->session = $session;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
            $this->session->setId(xx);
    }
}

【讨论】:

  • 有了这种监听器,它不会像第一条评论那样改变行为。使用设置 ID(控制器中的那些),我得到“无法更改活动会话的 ID”,如果我删除控制器上的设置 ID,我得到“无法启动会话:已由 PHP 启动($_SESSION iset )”。有了这个请求侦听器和正确的会话 ID,所有这些。
  • 嗯,我不明白你所说的“所有这些都与这个请求侦听器和正确的会话 ID”是什么意思:-s。无论如何,我知道很难改变 Sf 处理会话的方式。
【解决方案2】:

感谢大家的回答和评论。

确实,Symfony 2.3 添加了新的侦听器,而这些正是问题的根源。

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多