【发布时间】:2016-10-25 18:16:00
【问题描述】:
我有两个应用程序。一个是用 Zend Framework 编写的旧版本,一个是 Symfony 3.1 中的新版本应该与旧版本共享会话。
在旧的应用程序中使用本地文件存储,所以当我转到 app_dev.php 并写 session_start(); var_dump($_SESSION); 时,我在会话中看到 '__ZF' 键,我需要在 symfony3 应用程序中访问它。
显然上面的代码只是为了检查会话是否在域内共享。
在 symfony3 应用程序中,我尝试订阅事件 KernelEvents::REQUEST,我想从请求中获取原始会话并创建一个包含来自 Zend2 的参数的包。
class SessionSubscriber implements EventSubscriberInterface
{
public function onKernelRequest(GetResponseEvent $event)
{
if ($event->isMasterRequest() && true == $event->getRequest()->hasSession()) {
var_dump($event->getRequest());
$event->getRequest()->getSession()->registerBag(new ZendSessionBag());
var_dump($event->getRequest()->getSession()->getBag('zf'));
exit;
return;
}
}
public static function getSubscribedEvents()
{
return array(
KernelEvents::REQUEST => (array('onKernelRequest', 127))
);
}
}
但我无法访问来自$event->getRequest(); 的原始会话数据
这就是我的包到目前为止的样子。据我了解,我应该可以在 initialize() 方法中访问原始会话数据
class ZendSessionBag implements SessionBagInterface
{
private $storageKey;
private $sessionData;
public function __construct($storageKey = '__ZF')
{
$this->storageKey = $storageKey;
}
public function getName()
{
return 'zf';
}
public function initialize(array &$array)
{
var_dump($array); // here should be raw $_SESSION data
$this->sessionData = &$array;
}
public function getStorageKey()
{
return $this->storageKey;
}
public function clear()
{
$this->sessionData = [];
}
}
因此,当我获得会话并获得名为“zf”的包时,我将可以访问数据。
这也是我关于会话的配置:
session:
storage_id: session.storage.php_bridge
handler_id: session.handler.native_file
save_path: "/var/lib/php5/sessions"
任何帮助将不胜感激。
【问题讨论】:
-
您是否考虑过使用TheodoEvolutionSessionBundle 来桥接遗留会话?主要区别在于您注册的是自己的包实现,但捆绑包uses the ones provided by Symfony。
-
是的,我试过了,但它与 SF 3.1 不兼容
标签: php session zend-framework2 symfony