以下是我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 Db Instance
服务的servicemanager时,我都会创建一个新的masterSlaveFeature
。
我认为解决方案可能是使用服务管理器来处理MasterSlaveFeature Db Instance
但是如何将克隆的db adapter
传递给服务管理器以使用适配器加载实例?
我正在考虑制作一个处理MasterSlaveFeature实例的新服务。
答案 0 :(得分:1)
首先,您不需要克隆适配器。
其次,服务管理器默认使用共享实例,这意味着连续调用将返回先前创建的实例,除非您在config实例中指定不共享。
至于你想要实现的目标,你应该定义别名,例如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'
),
),
当您拥有真正的从属适配器时,您将用适配器工厂替换别名