2012-12-24 39 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

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