使用 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'
    ),
),

当你有真正的从属适配器时,你将用适配器工厂替换别名