0

我正在使用多个数据库。所以我的global.php文件中有这种配置:

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

我的目标是在一条指令中配置所有适配器。我不知道这是否可能。有这个指令可以得到一个适配器:

$sm->get('adapter1');

但我想要这样的东西:

$sm->get('adapters');

我现在没有找到任何解决方案,所以我决定在这里问这个问题......我想这是可能的,因为文件只包含一个简单的数组......

你的

编辑

我试过了

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

但它返回一个字符串数组。实际上,我想要一个对象数组。适配器的对象。以同样的方式获得适配器:

$sm->get('adapter1');

你的

4

2 回答 2

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;
于 2016-11-11T10:47:43.093 回答
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');
} 
于 2016-11-12T13:51:32.307 回答