php - 如何在 Symfony3 应用程序中读取 Zend2 session

标签 php session zend-framework2 symfony

我有两个应用程序。一个遗留的是用 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"

如有任何帮助,我们将不胜感激。

最佳答案

我已经成功了。

首先我改变了配置:

我已经更改了保存路径并删除了 native 处理程序:

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/

相关文章:

php - 在 zend framework 2 中启用 BjyProfiler 模块

php - ZF2 日期之间

javascript - 如何将 ajax 结果输出到 php 变量中?

php - PDO SQLite创建数据库默认权限

javascript - Wicket 6 在 JavaScript 中使 session 无效

php - 无法在 phpMyAdmin 中无错误地启动 session

javascript - 需要 JSSOR slider 才能根据引用页面落在特定图像上

php - PHP 的配置管理器

node.js - Express redis session 存储停止在新机器上工作

php - ZF2 何时使用 getServiceLocator() 何时不使用