我有两个应用程序。一个旧的用Zend Framework编写,而新的Symfony 3.1则应该与一个旧的共享 session 。
在旧的应用程序中,使用 native 文件存储,因此当我转到app_dev.php并编写session_start(); var_dump($_SESSION);
时,我在 session 中看到“__ZF”键,我需要在symfony3应用程序中对其进行访问。
显然,以上代码仅用于检查 session 是否在域内共享。
在symfony3应用程序中,我尝试订阅了KernelEvents::REQUEST
事件,在那里我想从请求中获取原始 session ,并使用来自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();
访问原始 session 数据到目前为止,这就是我的书包的样子。据我了解,我应该可以使用initialize()方法访问原始 session 数据
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 = [];
}
}
因此,当我获得 session 并获得名为“zf”的包时,我将有权访问数据。
这也是我关于 session 的配置:
session:
storage_id: session.storage.php_bridge
handler_id: session.handler.native_file
save_path: "/var/lib/php5/sessions"
任何帮助,将不胜感激。
最佳答案
我设法使它起作用。
首先,我更改了配置:
我已经更改了保存路径并删除了本地处理程序:
session:
save_path: "/var/lib/php5/sessions"
然后,我更改了EventSubscriber:
class SessionSubscriber implements EventSubscriberInterface
{
/**
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event)
{
$bag = null;
$session = $event->getRequest()->getSession();
try
{
$bag = $session->getBag('zf');
}
catch (\InvalidArgumentException $e)
{
$bag = new NamespacedAttributeBag("__ZF");
$bag->setName("zf");
$session->registerBag($bag);
$session->start();
}
$bag->set('userId', isset($_SESSION['Zend_Auth']->storage) ? $_SESSION['Zend_Auth']->storage : null);
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return array(
KernelEvents::REQUEST => (array('onKernelRequest', 127))
);
}
}
我已经从Zend
Zend\Stdlib\ArrayObject
导入了类,之后我可以访问包zf
中想要的变量。关于php - 如何在Symfony3应用程序中阅读Zend2 session ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37991167/