ZF3 несколько адаптеров базы данных

в ZF2 можно было настроить несколько адаптеров, как это в module.config.php:

'db' => array(
'adapters'=>array(
'db1' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf2;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
'username' => 'zf2',
'password' => 'zf2test',
),
'db2' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf1;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
'username' => 'zf1',
'password' => 'zf1test',
),
)

),

На фабрике контроллеров я мог получить их через ServiceManager:

class AlbumControllerFactory implements FactoryInterface
{

public function createService(ServiceLocatorInterface $serviceLocator)
{
$albumTable = $serviceLocator->getServiceLocator()->get('Album\Model\AlbumTable');
$db1Adapter = $serviceLocator->getServiceLocator()->get('db1');
$db2Adapter = $serviceLocator->getServiceLocator()->get('db2');

return new AlbumController($albumTable, $db1Adapter, $db2Adapter);
}
}

Теперь я пытаюсь сделать то же самое в Zend Framework 3 — но эта конфигурация вложенного массива не работает:

Fatal error: Uncaught exception 'Zend\Db\Adapter\Exception\InvalidArgumentException' with message 'createDriver expects a "driver" key to be present inside the parameters' in /var/www/USER/teckert/zf3/vendor/zendframework/zend-db/src/Adapter/Adapter.php:262

Я думаю, что в ZF 2 adapters ключи уже обрабатываются, когда dbAdapter пытается создать драйвер — но в ZF 3 этого не происходит.

Любые намеки тепло приветствуются …

Руководство по Zend-DB с разделом адаптеров не было достаточно ясно для меня

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

В соответствии с этот документ Я добавил следующий фрагмент в глобальный файл конфигурации:

'service_manager' => [
'abstract_factories' => [
\Zend\Db\Adapter\AdapterAbstractServiceFactory::class,
],
],

При попытке получить dbAdapter с $container->get('db1') в моем AlbumTableFactory Я получаю эту ошибку:

Unable to resolve service "db1 to a factory; are you certain you provided it during configuration?

2

Решение

Убедитесь, что вы добавили Zend\Db\Adapter\AdapterAbstractServiceFactory к abstract_factories массив конфигурации ServiceManager.
Эта абстрактная фабрика отвечает за создание отдельных адаптеров базы данных. Кроме того, проверьте, является ли ваш Album\Model\AlbumTable Фабрика получает адаптер базы данных с правильным именем.

1

Другие решения

Хорошо, я наконец решил проблему.

Как уже упоминалось @Pieter, мне нужно было следующее содержимое массива в моем config.php:

'service_manager' => [
'abstract_factories' => [
\Zend\Db\Adapter\AdapterAbstractServiceFactory::class,
],
],

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

  1. AlbumControllerFactory называется и получить это зависимый AlbumTable оказание услуг ($container->get(AlbumTable::class);), который затем вызывает AlbumTableFactory
  2. AlbumTableFactory затем готовит конструктор инъекций для AlbumTable с $tableGateway = $container->get(AlbumTableGateway::class);
  3. Теперь я объединил логику из AlbumTableFactory и AlbumTableGatewayFactory в один AbstractFactoryInterface (Я полностью удалил AlbumTableGatewayFactory)
// AlbumTableFactory implements AbstractFactoryInterface

public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$dbAdapter = $container->get('db1');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Album());

$tableGateway = new TableGateway('album', $dbAdapter, null, $resultSetPrototype);

return new AlbumTable($tableGateway);
}
1

По вопросам рекламы [email protected]