Если вы хотите коллекцию адаптер объектов можно смоделировать это как услугу, которую вы регистрируете в диспетчере услуг.
Эта услуга проста в классе коллекций, называемом 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');
}
Если вы просто хотите config: '$ adapters = $ sm-> get ('config') ['db'] ['adapters];'. Сервисный ключ 'config' вернет объединенный массив конфигурации приложения. – AlexP
Спасибо ... Но я просто вижу, что мне не нужен массив строк, а массив объектов. Объекты адаптера. Точно так же я получаю объект с '$ sm-> get ('adapter1');' – Renaud
Не добавляйте существенную дополнительную информацию в комментарии: отредактируйте свой пост. Следуйте [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask). – greybeard