会话值为空,为什么?
Session values are null, why?
我在 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
.
一样
有线索吗?想法?
我同意@bishop 并且你正确地桥接了会话,但我相信你的问题是不同的。我的假设是您的会话 save_path 未在 Zend 和 Symfony 应用程序之间共享。
您必须使用相同的路径才能工作。
尝试设置:
phpSettings.session.save_path = "/path/to/symfony/kernel/root/sessions"
在您的 application.ini Zend 框架应用程序中。
替换为您的会话路径。
我在 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
.
有线索吗?想法?
我同意@bishop 并且你正确地桥接了会话,但我相信你的问题是不同的。我的假设是您的会话 save_path 未在 Zend 和 Symfony 应用程序之间共享。 您必须使用相同的路径才能工作。 尝试设置:
phpSettings.session.save_path = "/path/to/symfony/kernel/root/sessions"
在您的 application.ini Zend 框架应用程序中。 替换为您的会话路径。