会话值为空,为什么?

时间:2017-02-24 20:22:05

标签: php session zend-framework symfony

我有一个在Zend Framework 1(ZF1)上运行的旧应用程序,我开始进行Symfony3(SF)迁移,因此我已经设置了一些.htaccess规则,以使Symfony3在ZF1内部工作应用。基本上,如果我调用Symfony路由,它将转到Symfony控制器,否则转到ZF1控制器。

我需要在SF控制器中使用ZF1会话数据,但ZF1会话和SF会话完全以不同的方式工作,因此从SF调用ZF1会话不会起作用。 (我已经测试过了。)

然后我想到的是将相同的数据保存到两个会话对象中:ZF1用于遗留应用程序和新控制器上使用的SF,所以我最终会得到这样的结果:

// The following goes to an special ZF1 storage managed through Session
$this->view->user = Zend_Auth::getInstance();
$result           = $this->view->user->getStorage()->read();

// This is a Symfony\Component\HttpFoundation\Session\Session
$session_1 = new Session(new PhpBridgeSessionStorage());
$session_1->start();
$session_1->set('result', $this->view->user->getStorage()->read());

// here $session_1 holds the values properly
$session_1->get('result'); 

Symfony会话配置如下:

session:
    handler_id:  session.handler.native_file
    save_path: '%kernel.root_dir%/sessions'

然后在我的Symfony控制器中,我尝试访问存储的数据:

$session = new Session();
$result = $session->get('result');

$session->get('result')的值为null,据我所知,它不应为空。我不知道目录结构是否是这个问题的原因,或者我做错了什么或者可能很简单,这根本不可能,因为Session()对象实例由于目录结构而不同。

这就是目录的结构(很奇怪,但这是我到目前为止找到的唯一方法):

├── application
│   ├── api
│   ├── controllers -> ZF1 controllers
│   ├── forms
│   ├── layout
│   ├── models
│   ├── soap
│   └── views
...
├── oneview_symfony -> this is the SF app
│   ├── app
...
│   ├── var
│   ├── vendor -> it has his own /vendor folder and a /symfony libraries
│   └── web
...
└── vendor
    ...
    ├── symfony -> /symfony libraries are here as well
    ...
    ├── zendframework

更新

之前没有尝试过,但是现在关注@bishop建议我已经通过添加以下内容来弥合Symfony会话与ZF1会话(或者至少我认为我做过):

session:
    storage_id: session.storage.php_bridge
    handler_id:  session.handler.native_file
    save_path: '%kernel.root_dir%/sessions' 

但它也不起作用,错误与result获取null之前的错误相同。

任何线索?想法?

1 个答案:

答案 0 :(得分:0)

我同意@bishop并且你正确地弥合了会话,但我相信你的问题是不同的。我的假设是你的会话save_path不在Zend和Symfony应用程序之间共享。 您必须使用相同的路径才能工作。 尝试设置:

phpSettings.session.save_path = "/path/to/symfony/kernel/root/sessions"

在Zend框架应用程序的application.ini中。 替换为您的会话路径。