Использование ZF2 SessionManager

Я новичок в ZF2 и не совсем привык к тому, как это делать. Я хочу использовать сеанс для отслеживания пользователя (помните меня). У меня был этот код в одной части моего класса:

$sessionManager = new \Zend\Session\SessionManager(); $sessionManager->rememberMe($time); // i want to keep track of my user id too $populateStorage = array('user_id' => $user->getId()); $storage = new ArrayStorage($populateStorage); $sessionManager->setStorage($storage); 

Хорошо, пока все хорошо. Когда я пытаюсь:

 var_dump($sessionManager->getStorage()); 

Я получаю ожидаемые данные.

В другой части моей программы я хочу снова восстановить мои данные (немного похоже на контейнеры):

 $sessionManager = new \Zend\Session\SessionManager(); var_dump($sessionManager->getStorage()); 

Это возвращает только пустой объект. Я предполагаю, что это связано с «новым», и я думаю, что мне нужно реализовать SessionManager по-другому, но как? Я не знаю. Вот что я придумал:

В моем модуле i теперь есть:

 public function onBootstrap(\Zend\Mvc\MvcEvent $e) { $config = $e->getApplication() ->getServiceManager() ->get('Configuration'); $sessionConfig = new SessionConfig(); $sessionConfig->setOptions($config['session']); $sessionManager = new SessionManager($sessionConfig); $sessionManager->start(); 

В моем module.config:

 'session' => array( 'remember_me_seconds' => 2419200, 'use_cookies' => true, 'cookie_httponly' => true, ), 

Но как действовать? Как получить экземпляр для моего sessionManager?

Не существует хорошо документированного SessionManagerFactory ( zf2 api doc ) и SessionConfigFactory ( zf2 api doc ). С этими моментами SessionManager очень простой, просто поставьте эти фабрики в конфигурацию ServiceManager:

 'service_manager' => [ 'factories' => [ 'Zend\Session\SessionManager' => 'Zend\Session\Service\SessionManagerFactory', 'Zend\Session\Config\ConfigInterface' => 'Zend\Session\Service\SessionConfigFactory', ], ], 

и в конфигурации модуля поместите свои параметры сеанса под ключ session_config:

 'session_config' => [ 'remember_me_seconds' => 2419200, 'use_cookies' => true, 'cookie_httponly' => true, ], 

и все, теперь вы можете захватить SessionManager из локатора службы где угодно, например, в контроллере:

 /** @var Zend\Session\SessionManager $sm */ $sessionManager = $this->serviceLocator->get('Zend\Session\SessionManager'); 

Это доступно в версии 2.2 Zend Framework ( связанный запрос на растяжение ).

В моем проекте я использую пример из другого источника (книга или официальная документация, забудьте).

Основной файл Module.php :

 namespace Application; class Module { public function getServiceConfig() { return array( 'factories' => array( 'Zend\Session\SessionManager' => function ($sm){ $config = $sm->get('config'); if (isset($config['session'])){ $session_config = $config['session']; $sessionConfig = null; if (isset($session_config['config'])){ $class = isset($session_config['config']['class']) ? $session_config['config']['class'] : 'Zend\Session\Config\SessionConfig'; $options = isset($session_config['config']['options']) ? $session_config['config']['options'] : array(); $sessionConfig = new $class(); $sessionConfig->setOptions($options); } $sessionStorage = null; if (isset($session_config['storage'])){ $class = $session_config['storage']; $sessionStorage = new $class(); } $sessionSaveHandler = null; if (isset($session_config['save_handler'])){ // class should be fetched from service manager // since it will require constructor arguments $sessionSaveHandler = $sm->get($session_config['save_handler']); } $sessionManager = new SessionManager( $sessionConfig, $sessionStorage, $sessionSaveHandler ); if (isset($session_config['validator'])){ $chain = $sessionManager->getValidatorChain(); foreach ($session_config['validator'] as $validator){ $validator = new $validator(); $chain->attach('session.validate', array( $validator, 'isValid' )); } } } else { $sessionManager = new SessionManager(); } Container::setDefaultManager($sessionManager); return $sessionManager; }, ), ); } } 

config/autoload/global.php конфигурации config config/autoload/global.php :

 return array( 'session' => array( 'config' => array( 'class' => 'Zend\Session\Config\SessionConfig', 'options' => array( 'use_cookies' => true, ), ), 'storage' => 'Zend\Session\Storage\SessionArrayStorage', 'validators' => array( array( 'Zend\Session\Validator\RemoteAddr', 'Zend\Session\Validator\HttpUserAgent', ), ), ), ); 

Чтобы получить user_id из сеанса:

 $sessionStorage = $sm->get('Zend\Session\SessionManager') ->getStorage(); $user_id = $sessionStorage->user_id;