2012-12-24 40 views
0

我有这样的代码:Zend框架2的最佳方式来实现会话

 $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); 

工作很好,但是这个代码是在onBootstrap()方法Module.php文件。有没有更好的方式(地点?)来实施会议?控制器插件用于控制器,那么这些是什么?

回答

4

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

这与我们处理我们的mail,loggingcache(虽然缓存尚未完成)完全相同。在这些情况下,我们创建可以注入应用程序服务的服务。在你的情况下,我会让它成为一个听众(封装在一个专门的课程中),在你的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; 
    } 
} 
+0

好一点,我将测试它。 –

+0

好吧,一切都更好,之前:)谢谢你的建议。 –