Zend Framework 2实施会议的最佳方法



我有这样的代码:

        $sessionOptions = new SessionDbSavehandlerOptions();
        $sessionOptions->setDataColumn('data')
                       ->setIdColumn('id')
                       ->setModifiedColumn('modified')
                       ->setLifetimeColumn('lifetime')
                       ->setNameColumn('name');
        $application    = $event->getApplication();
        $serviceManager = $application->getServiceManager();
        $dbAdapter = $serviceManager->get('ZendDbAdapterAdapter');
        $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()方法中。有没有更好的方法(地点?)实施会话?控制器插件适用于控制器,所以这些插件是什么?

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

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

一个小例子:

namespace MySession;
use ZendSessionContainer;
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' => 'MySessionServiceSessionManagerFactory'
            ),
        );
    }
}

您将会话经理的工厂逻辑封装在出厂类中:

namespace MySessionService;
use ZendServiceMangerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
// 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('ZendDbAdapterAdapter');
        $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;
    }
}

最新更新