Как получить конфигурацию для адаптеров базы данных

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

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

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

$sm->get('adapter1');

Но я хочу что-то подобное:

$sm->get('adapters');

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

ваш

РЕДАКТИРОВАТЬ :

Я старался

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

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

$sm->get('adapter1');

ваш

0

Решение

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

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

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

$adapters->adapter1;
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