2013-12-17 11 views
5

Tôi mới sử dụng ZF2 và không quen với cách làm công cụ. Tôi muốn sử dụng phiên để theo dõi người dùng (nhớ tôi). Tôi đã có mã này trong một phần của lớp học của tôi:Sử dụng phiên làm việc ZF2 SessionManager

$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); 

Ok, cho đến nay rất tốt. Khi tôi thử:

var_dump($sessionManager->getStorage()); 

Tôi nhận được dữ liệu mong đợi.

Trong một phần khác của chương trình của tôi, tôi muốn truy xuất dữ liệu của tôi một lần nữa (hơi giống container):

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

này chỉ trả về một đối tượng rỗng. Tôi đoán điều này là do "mới" và tôi nghĩ rằng tôi phải thực hiện SessionManager theo một cách khác, nhưng làm thế nào? Tôi không biết. Đây là những gì tôi đã đưa ra:

Trong mô-đun của tôi bây giờ có:

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(); 

Trong module.config tôi:

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

Nhưng làm thế nào để procede? Làm thế nào để tôi có được thể hiện cho sessionManager của tôi?

Trả lời

12

Không có tài liệu SessionManagerFactory (zf2 api doc) và SessionConfigFactory (zf2 api doc). Với những là nhanh chóng SessionManager rất dễ dàng, chỉ cần đặt các nhà máy để cấu hình ServiceManager của bạn:

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

và mô-đun cấu hình đặt tùy chọn phiên của bạn, dưới sự chủ chốt session_config:

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

và đó là nó, bây giờ bạn có thể lấy SessionManager từ bộ định vị dịch vụ ở bất kỳ đâu, ví dụ như trong bộ điều khiển:

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

Có sẵn phiên bản 2.2 của khung công tác Zend (related pull request).

+0

Tuyệt vời, không nhận thấy dịch vụ này rất hữu ích! – razor7

+2

Rất tiếc là Zend 2 không có tài liệu phù hợp. Có vẻ như zend 2 chỉ dành cho những người phát triển nó. – kta

1

Trong dự án của tôi, tôi sử dụng ví dụ từ nguồn khác (sách hoặc tài liệu chính thức, hãy quên).

chính Module.php file:

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; 
       }, 
      ), 
     ); 
    } 
} 

My config/autoload/global.php cấu hình file:

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', 
      ), 
     ), 
    ), 
); 

Để có được user_id từ phiên:

$sessionStorage = $sm->get('Zend\Session\SessionManager') 
    ->getStorage(); 
$user_id = $sessionStorage->user_id; 
Các vấn đề liên quan