使用ZF2 ServiceManager处理MasterSlaveFeature

Here is my config within my 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;                
                    },
                ),
            ),

Here is the problem. As you can see I create a new MasterSlaveFeature Db Instance every time I call the servicemanager for the masterSlaveFeature service.

I was thinking that a solution could be using the service manager to handle the MasterSlaveFeature Db Instance but how do I pass the cloneddb adapter to the service manager for loading the instance with the adapter?

I was thinking about making a new service that handles loading the MasterSlaveFeature instance.

First of all you don't need to clone adapter.

Second, service manager uses shared instances by default, meaning consecutive call will return previously created instance, unless you specify in config instance is not shared.

As for what you want to achieve, you should define alias, eg db_slave_adapter and use that alias to fetch 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;                
        },
    ),
),

Define alias in your application level configuration:

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

when you will have real slave adapter, you will replace alias with adapter factory