【问题标题】:Zend Framework 2 Best way to implement sessionsZend Framework 2 实现会话的最佳方式
【发布时间】:2012-12-24 19:57:27
【问题描述】:

我有这样的代码:

        $sessionOptions = new SessionDbSavehandlerOptions();
        $sessionOptions->setDataColumn('data')
                       ->setIdColumn('id')
                       ->setModifiedColumn('modified')
                       ->setLifetimeColumn('lifetime')
                       ->setNameColumn('name');
        $application    = $event->getApplication();
        $serviceManager = $application->getServiceManager();
        $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter');
        $sessionTableGateway = new TableGateway('zf2_sessions', $dbAdapter);
        $sessionGateway = new DbTableGateway($sessionTableGateway, $sessionOptions);
        $config = $serviceManager->get('Configuration');
        $sessionConfig = new SessionConfig();
        $sessionConfig->setOptions($config['session']);
        $sessionManager = new SessionManager($sessionConfig);
        $sessionManager->setSaveHandler($sessionGateway);
        $sessionManager->start();
        Container::setDefaultManager($sessionManager);

效果很好,但此代码在Module.php 文件中的onBootstrap() 方法中。有没有更好的方法(地点?)来实现会话?控制器插件是用于控制器的,那么这些是什么?

【问题讨论】:

    标签: php session implementation zend-framework2


    【解决方案1】:

    我的建议是将此作为专用的低级模块。您可以将完整的配置和实例化封装到一个简单的模块中,您可以依赖于您的进一步应用程序。

    这与我们处理mailloggingcache 完全相同(尽管缓存尚未完成)。在这些情况下,我们创建可以注入应用程序服务的服务。在您的情况下,我会将它设为一个侦听器(是否封装在专用类中),您可以在 onBootstrap() 方法中对其进行初始化。

    一个小例子:

    namespace MySession;
    
    use Zend\Session\Container;
    
    class Module
    {
        public function onBootstrap($e)
        {
            $app = $e->getApplication();
            $sm  = $app->getServiceManager();
    
            $manager = $sm->get('session_manager');
            $manager->start();
    
            Container::setDefaultManager($manager);
        }
    
        public function getServiceConfig()
        {
            return array(
                'factories' => array(
                    'session_manager' => 'MySession\Service\SessionManagerFactory'
                ),
            );
        }
    }
    

    你将会话管理器的工厂逻辑封装在一个工厂类中:

    namespace MySession\Service;
    
    use Zend\ServiceManger\FactoryInterface;
    use Zend\ServiceManager\ServiceLocatorInterface;
    
    // Your imports further here
    
    class SessionManagerFactory implements FactoryInterface
    {
        public function createService(ServiceLocatorInterface $sl)
        {
            $sessionOptions = new SessionDbSavehandlerOptions();
            $sessionOptions->setDataColumn('data')
                           ->setIdColumn('id')
                           ->setModifiedColumn('modified')
                           ->setLifetimeColumn('lifetime')
                           ->setNameColumn('name');
            $application    = $event->getApplication();
            $serviceManager = $application->getServiceManager();
            $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter');
            $sessionTableGateway = new TableGateway('zf2_sessions', $dbAdapter);
            $sessionGateway = new DbTableGateway($sessionTableGateway, $sessionOptions);
            $config = $serviceManager->get('Configuration');
            $sessionConfig = new SessionConfig();
            $sessionConfig->setOptions($config['session']);
            $sessionManager = new SessionManager($sessionConfig);
            $sessionManager->setSaveHandler($sessionGateway);
    
            return $sessionManager;
        }
    }
    

    【讨论】:

    • 好的,一切都比以前更好了:)谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多