Вот мой конфиг в моем 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
каждый раз, когда я звоню masterSlaveFeature
оказание услуг.
Я думал, что решением может быть использование менеджера сервисов для обработки MasterSlaveFeature Db Instance
но как мне передать клонированныйdb adapter
диспетчеру службы для загрузки экземпляра с помощью адаптера?
Я думал о создании нового сервиса, который обрабатывает загрузку экземпляра MasterSlaveFeature.
Прежде всего вам не нужно клонировать адаптер.
Во-вторых, диспетчер служб использует общие экземпляры по умолчанию, что означает, что последовательный вызов возвратит ранее созданный экземпляр, если вы не укажете, что в экземпляре конфигурации не используется общий доступ.
Что касается того, что вы хотите достичь, вы должны определить псевдоним, например, 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'
),
),
когда у вас будет настоящий подчиненный адаптер, вы замените псевдоним на заводской адаптер
Других решений пока нет …