如何让Symfony2直接读取php本地会话

时间:2012-11-26 05:55:27

标签: session symfony

我有一个Symfony2应用程序,我必须从另一个非symfony应用程序中读取会话集。

非symfony应用程序像往常一样将会话设置为$_SESSION

但是,当我尝试读取此会话时,数据不存在。无论我是通过

做到的
$session = $this->get('request')->getSession();
var_dump($session->all());

甚至(我知道我不应该这样做,但无论如何)

var_dump($_SESSION);

这给了我会话已经启动错误,我不知道为什么有错误,尽管我从未在Symfony应用程序中启动会话。告诉我这种方式是否真的有效,以便我可以查看session_start()事物。

$session = new Session();
$session->start();
var_dump($session->all());

PHPSESSID cookie在Symfony2应用程序中设置,其值与非symfony应用程序中设置的cookie相同,但我的Symfony2应用程序只是拒绝阅读会话内容。 ($session->getName()返回PHPSESSID,以明确)

(确切地说,两个应用都位于同一个域但不同的子域中,我已经在Symfony应用中的framework.session.domain中正确设置了app/config.yml,并在非symfony上调用了session_set_cookie_params应用程序具有相同的域设置,以允许在子域之间共享会话cookie,即.example.com

那么如何阅读由非symfony应用程序设置的Symfony2应用程序/控制器中的会话?感谢。

我正在使用Symfony 2.1,如果这很重要。

2 个答案:

答案 0 :(得分:8)

无需编写自定义会话处理程序,Symfony2中的本地会话处理程序可以直接从默认的PHP $ _SESSION读取/写入。

在Symfony2应用的config.yml中,添加save_path选项,如下所示:

framework:
    session:
        save_path: ~

清理缓存,现在您的会话将保存在默认的PHP路径中,而不是Symfony2 sessions文件夹中。您现在可以共享数据,这就是我在新的Sf2应用程序和旧的Sf1应用程序之间登录数据所做的工作。

答案 1 :(得分:3)

您将无法使用本机Symfony2会话包装器类,因为它们从app/cache/{env}/sessions/{session_id}读取会话数据,而您的非Symfony2应用程序未将其会话数据写入该位置。

您可以在非Symfony2应用程序中编写一个写入该位置的自定义会话处理程序,或者更好的是您可以在Symfony2中编写一个本机会话处理程序类,它绕过默认的Symfony2会话读取位置并从默认的PHP中获取它会话路径

编辑:自从写下这个答案后,现在有一个更优雅的解决方案可以在下面的gadbout帖子中找到。