使用ZF2 ServiceManager处理MasterSlaveFeature

时间:2015-01-12 21:00:09

标签: php zend-framework zend-framework2 master-slave

以下是我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实例的新服务。

1 个答案:

答案 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'
    ),
),

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