2016-07-22 2 views
0
базы данных

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

'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 with the adapters section не было достаточно ясно для меня

EDIT

по this doc я добавил следующий фрагмент кода в глобальный конфигурационный файл:

'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? 

ответ

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

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

+0

благодарит за ваш ответ. Я отредактировал сообщение – rogaa

+0

Не забывайте, что также должен быть установлен модуль Zend \ Db. Он не включен по умолчанию в Zend Framework 3. –

Смежные вопросы