0

Я использую несколько баз данных. Так что у меня есть такой конфигурации в моем global.php файла:Как получить конфигурацию для адаптеров базы данных

return [ 
'db' => [ 
    ... 
    ], 
    'adapters' => [ 
     'adapter1' => [ 
      ... 
      ] 
     ], 
     'adapter2' => [ 
      ... 
      ] 
     ] 
    ] 
] 
]; 

И моя цель состоит в том, чтобы получить конфигурацию всех моих адаптеров в одной инструкции. Я не знаю, возможно ли это. Существует эта инструкция, чтобы получить один адаптер:

$sm->get('adapter1'); 

Но я хочу, чтобы иметь что-то вроде этого:

$sm->get('adapters'); 

я не нашел какое-либо решение прямо сейчас, так что я решил задать вопрос здесь ... Я предполагаю, что это что-то возможно, потому что файл только содержащим простой массив ...

Вашего

EDIT:

Я попытался

$sm->get('config')['db']['adapters']; 

Но он возвращает массив строки. На самом деле, мне нужен массив объектов. Объекты адаптера. Точно так же я получаю адаптер таким образом:

$sm->get('adapter1'); 

Ваш

+1

Если вы просто хотите config: '$ adapters = $ sm-> get ('config') ['db'] ['adapters];'. Сервисный ключ 'config' вернет объединенный массив конфигурации приложения. – AlexP

+0

Спасибо ... Но я просто вижу, что мне не нужен массив строк, а массив объектов. Объекты адаптера. Точно так же я получаю объект с '$ sm-> get ('adapter1');' – Renaud

+0

Не добавляйте существенную дополнительную информацию в комментарии: отредактируйте свой пост. Следуйте [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask). – greybeard

ответ

0

Не уверен, если это то, что вы ищете, но вы могли бы использовать Zend\Config класс для этого. Вы можете найти более подробную информацию об этом классе here in the documentation:

// Create the object-oriented wrapper using the configuration data 
$adaptersConfig = $sm->get('config')['db']['adapters']; 
$adapters = new \Zend\Config($adaptersConfig); 

Теперь вы можете получить доступ к адаптерам, как вы хотели:

$adapters->adapter1; 
+0

Эй, спасибо, что ответишь. Я попытался, но результат не тот, который я хочу. Новый класс Zend \ Config \ Config не создает объект, который я ожидал. Возможно, я нашел другое решение ... Я над этим работаю. – Renaud

+0

@ Renaud, так что же вы ожидаете получить? Вам нужны фактические адаптеры вместо конфигурации для адаптеров? – Wilt

0

Если вы хотите коллекцию адаптер объектов можно смоделировать это как услугу, которую вы регистрируете в диспетчере услуг.

Эта услуга проста в классе коллекций, называемом DbAdapterCollection. Каждый объект адаптера хранится и ссылается на его имя.

class DbAdapterCollection 
{ 
    protected $adapters = []; 

    public function __construct(array $adapters = []) 
    { 
     $this->setAdapters($adapters); 
    } 

    public function hasAdapter($name) 
    { 
     return isset($this->adapters[$name]); 
    } 

    public function getAdapters() 
    { 
     return $this->adapters; 
    } 

    public function setAdapters(array $adapters) 
    { 
     $this->adapters = []; 

     foreach ($adapters as $name => $adapter) { 
      $this->setAdapter($name, $adapter); 
     } 
    } 

    public function getAdapter($name) 
    { 
     if (! $this->hasAdapter($name)) { 
      throw new \RuntimeException('An adapter with the name \'' . $name . '\' could not be found.'); 
     } 
     return $this->adapters[$name]; 
    } 

    public function addAdapter($name, \Zend\Db\Adapter $adapter) 
    { 
     $this->adapters[$name] = $adapter; 
    } 
} 

Чтобы заполнить этот класс адаптера объектов вы можете использовать фабрику обслуживания, чтобы ввести их в классе __construct. Мы можем использовать диспетчер сервисов, чтобы загрузить необходимую конфигурацию, чтобы мы знали, какие адаптеры следует добавить в службу сбора.

class DbAdapterCollectionFactory 
{ 
    public function __invoke(ServiceManager $serviceManager, $name, $requestedName) 
    { 
     $config = $serviceManager->get('config'); 

     $options = []; 
     $adapters = []; 

     if (isset($config['my_app']['services'][$requestedName])) { 
      $options = $config['my_app']['services'][$requestedName]; 
     } 

     if (! empty($options['adapters']) && is_array($options['adapters'])) { 
      foreach ($options['adapters'] as $name => $adapter) { 
       if (is_string($adapter) && $serviceManager->has($adapter)) { 
        $adapter = $serviceManager->get($adapter); 
       }  
       if ($adapter instanceof \Zend\Db\Adapter) { 
        $adapters[$name] = $adapter; 
       } 
      } 
     } 

     return new DbAdapterCollection($adapters); 
    } 
} 

Конфигурация для этого примера может выглядеть следующим образом.

'service_manager' => [ 
    'factories' => [ 
     'DbAdapterCollection' => 'MyApp\\Db\\DbAdapterCollectionFactory' 
    ], 
], 

// Example app config 
'my_app' => [ 
    'services' => [ 
     'DbAdapterCollection' => [ 
      // adapterName => dbServiceName, 
      'adapters' => [ 
       'adapter1' => 'MyApp\\Db\\Adapter1' 
       'adapter2' => 'adapter2' 
       'adapter3' => 'adapter3' 
      ], 
     ] 
    ], 
], 

Все, что вам нужно, - это позвонить службе у сервис-менеджера.

$adapterCollection = $serviceManager->get('DbAdapterCollection'); 
if ($adapterCollection->has('adapter1')) { 
    $adapter = $adapterCollection->get('adapter1'); 
} 
+0

Отличный способ, но я нашел лучшее подходящее решение. (В методе getServiceConfig() в классе Module я просто добавляю индекс, который возвращает массив моих адаптеров. – Renaud