使用 ZF2 ServiceManager 处理 MasterSlaveFeature
Using ZF2 ServiceManager to handle the MasterSlaveFeature
这是我在 Application module.config.php
:
中的配置
'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 实例。
首先你不需要克隆适配器。
其次,服务管理器默认使用共享实例,这意味着连续调用将return以前创建的实例,除非您在配置中指定不共享实例。
至于你想实现什么,你应该定义别名,例如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'
),
),
当你有真正的从属适配器时,你将用适配器工厂替换别名
这是我在 Application module.config.php
:
'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 实例。
首先你不需要克隆适配器。
其次,服务管理器默认使用共享实例,这意味着连续调用将return以前创建的实例,除非您在配置中指定不共享实例。
至于你想实现什么,你应该定义别名,例如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'
),
),
当你有真正的从属适配器时,你将用适配器工厂替换别名