2015-01-12 49 views
0

這是在我的Application module.config.php我的配置:使用ZF2的ServiceManager處理MasterSlaveFeature

  'service_manager' => array(
       'factories' => array(
        'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
        'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory', 
        'masterSlaveFeature' => function($sm){ 
         $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
         $slaveAdapter = clone $dbAdapter; 
         $feature = new Zend\Db\TableGateway\Feature\MasterSlaveFeature($slaveAdapter);     
         return $feature;     
        }, 
       ), 
      ), 

這是問題所在。正如你所看到的,我每次打電話給masterSlaveFeature服務的服務管理員時都會創建一個新的MasterSlaveFeature Db Instance

我在想,一個解決方案可能會使用服務管理器來處理MasterSlaveFeature Db Instance,但是如何將克隆的db adapter傳遞給服務管理器以便使用適配器加載實例?

我在考慮製作一個處理加載MasterSlaveFeature實例的新服務。

+0

爲什麼您需要克隆適配器?它仍將使用相同的db連接 – Xerkus

+0

每次調用$ sm-> get()時都不會創建主從機功能,它在默認情況下是共享的。 – Xerkus

回答

1

首先你不需要克隆適配器。

其次,服務管理器默認使用共享實例,意味着連續調用將返回先前創建的實例,除非您在配置實例中指定的不共享。

至於你想達到什麼,你應該定義的別名,如db_slave_adapter和使用別名來獲取適配器:

'service_manager' => array(
    'factories' => array(
     'masterSlaveFeature' => function($sm){ 
      $dbAdapter = $sm->get('db_slave_adapter'); 
      $feature = new Zend\Db\TableGateway\Feature\MasterSlaveFeature($dbAdapter);     
      return $feature;     
     }, 
    ), 
), 

定義別名在應用程序級別的配置:

'service_manager' => array(
    'aliases' => array(
     'db_slave_adapter' => 'Zend\Db\Adapter\Adapter' 
    ), 
), 

時您將擁有真正的從適配器,您將用適配器工廠替換別名

+0

完美!謝謝您的幫助 – jkushner

相關問題