2013-12-17 20 views
5

私はZF2を初めて使用しており、操作方法に慣れていません。セッションを使用してユーザーを追跡したい(私を覚えている)私はこのクラスをクラスの1つの部分に持っていました: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]私が試してみる:

var_dump($sessionManager->getStorage()); 

私は期待されるデータを得る。

私のプログラムの別の部分では、私は(ビットコンテナのように)再び私のデータを盗んたい:これは、空のオブジェクトを返す

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

。 これは "新しい"のためと私は別の方法でSessionManagerを実装する必要があると思うが、どうやって?私は知らない。私は今持っている私のモジュールで

:私のmodule.configで

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

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

しかし、どのようにprocedeするこれは私が思い付いたのですか?私はどのように私のsessionManagerのインスタンスを取得するのですか?

答えて

12

SessionManagerFactory(zf2 api doc)とSessionConfigFactory(zf2 api doc)はよく書かれていません。 session_configキーの下に、あなたのセッションのオプションを入れ

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

と構成をモジュールに:

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

、それが今、それだものと、非常に簡単SessionManagerのをインスタンス化し、ちょうどあなたのServiceManager構成にこれらの工場を置いています

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

これは、Zend Frameworkの2.2バージョンから入手できます(例:コントローラの場合) related pull request)。

+0

グレートは、この非常に便利なサービスを気づいていませんでした! – razor7

+2

Zend 2には適切な文書がありません。 Zend 2は、それを開発する人々のためのものです。 – kta

1

私のプロジェクトでは、他のソースからの例を使用しています(書籍または公式文書、忘れてください)。

メイン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設定ファイル:

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; 
関連する問題