2016-07-12 16 views
1

Zend\Session Save Handlerチュートリアルでは、DbTableGatewayの例として、$アダプタ変数が未定義のTableGatewayを作成しています。ハンドラを使用してSession Manager(チュートリアルの前のページ)を自分のデータベースのセッション記憶テーブルに結びつけたいと思います。これどうやってするの?Zend 2セーブハンドラの使い方DbTableGateway?

コードは次のようになりますか?

class Module implements AutoloaderProviderInterface, ConfigProviderInterface 
{ 
    public function onBootstrap(MvcEvent $e) { 
     $eventManager  = $e->getApplication()->getEventManager(); 

     // create the session manager 
     $moduleRouteListener = new ModuleRouteListener(); 
     $moduleRouteListener->attach($eventManager); 
     $this->bootstrapSession($e); 
    } 

    public function bootstrapSession($e) 
    { 
     $session = $e->getApplication() 
      ->getServiceManager() 
      ->get('Zend\Session\SessionManager'); 
     $tableGateway = new TableGateway('session', $adapter); // somehow define this somewhere? 
     $saveHandler = new DbTableGateway($tableGateway, new DbTableGatewayOptions()); 
     $session->setSaveHandler($saveHandler); 
     $session->start(); 

     $container = new Container('initialized'); 
     if (!isset($container->init)) { 
      $serviceManager = $e->getApplication()->getServiceManager(); 
      $request  = $serviceManager->get('Request'); 

      $session->regenerateId(true); 
      $container->init   = 1; 
      $container->remoteAddr = $request->getServer()->get('REMOTE_ADDR'); 
      $container->httpUserAgent = $request->getServer()->get('HTTP_USER_AGENT'); 

      $config = $serviceManager->get('Config'); 
      if (!isset($config['session'])) { 
       return; 
      } 

      $sessionConfig = $config['session']; 
      if (isset($sessionConfig['validators'])) { 
       $chain = $session->getValidatorChain(); 

       foreach ($sessionConfig['validators'] as $validator) { 
        switch ($validator) { 
         case 'Zend\Session\Validator\HttpUserAgent': 
          $validator = new $validator($container->httpUserAgent); 
          break; 
         case 'Zend\Session\Validator\RemoteAddr': 
          $validator = new $validator($container->remoteAddr); 
          break; 
         default: 
          $validator = new $validator(); 
        } 

        $chain->attach('session.validate', array($validator, 'isValid')); 
       } 
      } 
     } 
    } 

    public function getServiceConfig() 
    { 
     return array(
      'factories' => array(
       'Zend\Session\SessionManager' => function ($sm) { 
        $config = $sm->get('config'); 
        if (isset($config['session'])) { 
         $session = $config['session']; 

         $sessionConfig = null; 
         if (isset($session['config'])) { 
          $class = isset($session['config']['class']) ? $session['config']['class'] : 'Zend\Session\Config\SessionConfig'; 
          $options = isset($session['config']['options']) ? $session['config']['options'] : array(); 
          $sessionConfig = new $class(); 
          $sessionConfig->setOptions($options); 
         } 

         $sessionStorage = null; 
         if (isset($session['storage'])) { 
          $class = $session['storage']; 
          $sessionStorage = new $class(); 
         } 

         $sessionSaveHandler = null; 
         if (isset($session['save_handler'])) { 
          // class should be fetched from service manager since it will require constructor arguments 
          $sessionSaveHandler = $sm->get($session['save_handler']); 
         } 

         $sessionManager = new SessionManager($sessionConfig, $sessionStorage, $sessionSaveHandler); 
        } else { 
         $sessionManager = new SessionManager(); 
        } 
        Container::setDefaultManager($sessionManager); 
        return $sessionManager; 
       }, 
      ), 
     ); 
    } 

    /*************************************************************************************************** 
    * Returns the location of the module.config.php file. This function is used by the Zend Framework 
    * underneath the hood. 
    ***************************************************************************************************/ 
    public function getConfig() 
    { 
     return include __DIR__ . '/config/module.config.php'; 
    } 

    /*************************************************************************************************** 
    * Returns the Zend StandardAutoLoader which contains the directory structure of the module source 
    * folder. 
    ***************************************************************************************************/ 
    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
} 

答えて

2

このコードは、セッションをdbテーブルに保存するためのコードです。

'service_manager' => array(
    'factories' => array(
     'Zend\Session\SessionManager' => function (\Zend\ServiceManager\ServiceManager $sm) { 
      $sessionConfig = new \Zend\Session\Config\SessionConfig(); 
      $sessionConfig->setOptions(
       array(
        'use_cookies' => true, 
        'name' => 'ed2', 
        'gc_maxlifetime' => 1728000 
       ) 
      ); 

      /* @var $adapter \Zend\Db\Adapter\Adapter */ 
      $adapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $tableGateway = new \Zend\Db\TableGateway\TableGateway('session', $adapter); 
      $saveHandler = new \Common\Session\SaveHandler\DbTableGateway(
       $tableGateway, 
       new \Zend\Session\SaveHandler\DbTableGatewayOptions() 
      ); 

      $sessionManager = new \Zend\Session\SessionManager($sessionConfig); 
      $sessionManager->setSaveHandler($saveHandler); 
      $sessionManager->start(); 
      return $sessionManager; 
     }, 
    ) 
) 

コンフィグdb

'db' => array(
    'driver' => 'Pdo_Mysql', 
    'database' => 'release', 
    'username' => 'username', 
    'password' => 'password', 
    'hostname' => '127.0.0.1', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ) 
), 
'service_manager' => array(
    'factories' => array(
     'Zend\Db\Adapter\Adapter' => function (\Zend\ServiceManager\ServiceManager $serviceManager) { 
      $adapterFactory = new Zend\Db\Adapter\AdapterServiceFactory(); 
      $adapter = $adapterFactory->createService($serviceManager); 

      Zend\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($adapter); 

      return $adapter; 
     } 
    ) 
) 
+0

おかげで、私は、私は例外「のZend \ ServiceManagerを得ることをしようとすると、これは新しいgetServiceConfigは次のようになります。 \ ServiceManager :: getがインスタンスを取得または作成できませんでした。 " – Miryafa

+1

@Miryafaデータベース用のアダプタを作成する必要があります。私は私の答えにDbアダプターの工場を追加しました。 – newage

0

のための答えは、ニューエイジの答えのようであることが判明:

ニューエイジは、DBアダプタが含まれるように彼の答えを編集したので、私のようにそれを受け入れてきました正しい答え。残りの部分は私の実装です:

bootstrapSessionメソッドからすべてのTableGatewayとsavehandlerロジックを削除し、getServiceConfigメソッドに入れることができます。

はアダプタ、TableGatewayを含み、およびハンドラを保存するために'Zend\Session\SessionManager'機能を変更し、その後、getServiceConfigで'factories'アレイへのアダプタの定義を追加します。次に、モジュールのconfigファイルにデータベース接続情報を追加

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(

      // New code here 
      'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 
      // New code here 

      'Zend\Session\SessionManager' => function ($sm) { 
       $config = $sm->get('config'); 
       if (isset($config['session'])) { 
        $session = $config['session']; 

        $sessionConfig = null; 
        if (isset($session['config'])) { 
         $class = isset($session['config']['class']) ? $session['config']['class'] : 'Zend\Session\Config\SessionConfig'; 
         $options = isset($session['config']['options']) ? $session['config']['options'] : array(); 
         $sessionConfig = new $class(); 
         $sessionConfig->setOptions($options); 
        } 

        $sessionStorage = null; 
        if (isset($session['storage'])) { 
         $class = $session['storage']; 
         $sessionStorage = new $class(); 
        } 

        $sessionSaveHandler = null; 
        if (isset($session['save_handler'])) { 
         // class should be fetched from service manager since it will require constructor arguments 
         $sessionSaveHandler = $sm->get($session['save_handler']); 
        } 
        $sessionManager = new SessionManager(); 
       } 

       // New code here 
       /* @var $adapter \Zend\Db\Adapter\Adapter */ 
       $adapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $tableGateway = new TableGateway('mytablename', $adapter); 
       $saveHandler = new DbTableGateway($tableGateway, new DbTableGatewayOptions()); 
       $sessionManager->setSaveHandler($saveHandler); 
       // New code here 

       Container::setDefaultManager($sessionManager); 
       return $sessionManager; 
      }, 
     ), 
    ); 
} 

return array(
    // ... 
    'db' => array(
     'driver'   => 'Pdo', 
     'dsn'   => 'mysql:dbname=mydbname;host=mydbhost;port=xxxx', 
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
     ), 
     'username'  => 'dbusername', 
     'password'  => 'dbpassword', 
    ), 
); 
関連する問題