如何在Symfony3应用程序中阅读Zend2会话

时间:2016-06-23 12:06:46

标签: php session zend-framework2 symfony

我有两个申请。其中一个是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"

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我设法让它发挥作用。

首先我改变了配置:

我已更改保存路径并删除本机处理程序:

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中访问我想要的变量。