Rob*_*ert 7 php session symfony zend-framework2
我有两个申请.遗留的一个是用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))
);
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法访问原始会话数据 $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 = [];
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我获得会话然后得到名为"zf"的包时,我将可以访问数据.
这也是我关于会话的配置:
session:
storage_id: session.storage.php_bridge
handler_id: session.handler.native_file
save_path: "/var/lib/php5/sessions"
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
我已经成功让它发挥作用了。
首先我改变了配置:
我更改了保存路径并删除了本机处理程序:
session:
save_path: "/var/lib/php5/sessions"
Run Code Online (Sandbox Code Playgroud)
然后我改变了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))
);
}
}
Run Code Online (Sandbox Code Playgroud)
我从 Zend 导入了类,Zend\Stdlib\ArrayObject之后我可以访问 bag 中我想要的变量zf。
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |