我有这样的代码:
$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;
}
}