php - Zend Framework 2 La mejor forma de implementar sesiones
session implementation (1)
Tengo un código como este:
$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);
funciona bien, pero este código está en el método onBootstrap()
en el archivo Module.php
. ¿Hay una mejor manera (¿lugar?) Para implementar la sesión? Los complementos del controlador son para el controlador, entonces, ¿qué es esto?
Mi sugerencia sería hacer de este un módulo dedicado de bajo nivel. Puede encapsular la configuración completa y la creación de instancias en un módulo simple del que puede depender para su posterior aplicación.
Es bastante similar a como manejamos nuestro correo , registro y caché (aunque el caché aún no está completo). En esos casos creamos servicios que podemos inyectar en nuestros servicios de aplicaciones. En su caso, lo convertiría en un oyente (encapsulado en una clase dedicada o no) donde lo inicializa en su método onBootstrap()
.
Un pequeño ejemplo:
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''
),
);
}
}
Y encapsula la lógica de fábrica del administrador de sesión en una clase de fábrica:
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;
}
}