в 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?
Убедитесь, что вы добавили Zend\Db\Adapter\AdapterAbstractServiceFactory
к abstract_factories
массив конфигурации ServiceManager.
Эта абстрактная фабрика отвечает за создание отдельных адаптеров базы данных. Кроме того, проверьте, является ли ваш Album\Model\AlbumTable
Фабрика получает адаптер базы данных с правильным именем.
Хорошо, я наконец решил проблему.
Как уже упоминалось @Pieter, мне нужно было следующее содержимое массива в моем config.php
:
'service_manager' => [
'abstract_factories' => [
\Zend\Db\Adapter\AdapterAbstractServiceFactory::class,
],
],
Кроме того, мне пришлось изменить процесс, в котором мои классы и зависимые фабрики общаются друг с другом.
AlbumControllerFactory
называется и получить это зависимый AlbumTable
оказание услуг ($container->get(AlbumTable::class);
), который затем вызывает AlbumTableFactory
AlbumTableFactory
затем готовит конструктор инъекций для AlbumTable
с $tableGateway = $container->get(AlbumTableGateway::class);
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);
}