2016-07-22 33 views
0

in ZF2 war es möglich, mehrere Adapter wie dies in der module.config.php zu konfigurieren: IchZF3 mehrere Datenbankadapter

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); 
    } 
} 

Jetzt:

'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', 
     ), 
    ) 

), 

In der Controller Factory ich sie über den Servicemanager bekommen könnte Ich versuche, das gleiche in Zend Framework 3 zu tun - aber diese geschachtelte Array-Konfiguration funktioniert nicht:

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 

Ich denke, dass in ZF2 die adapters Schlüssel sind bereits behandelt, wenn der dbAdapter den Fahrer zu schaffen versucht - aber dies geschieht nicht in ZF 3.

Irgendwelche Hinweise sind herzlich willkommen ...

Die Handbuch der zend-db with the adapters section war nicht klar genug für mich

EDIT

nach this doc ich habe den folgenden Code-Schnipsel in der globalen Konfigurationsdatei hinzugefügt:

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

Beim Versuch, den dbAdapter mit $container->get('db1') in meinem AlbumTableFactory zu bekommen ich diesen Fehler:

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

Antwort

1

Okay, ich habe das Problem endlich gelöst.

Wie @Pieter erwähnt brauchte ich die folgende Array Inhalt in meinem config.php:

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

Zusätzlich musste ich den Prozess Fabriken meine Klassen und abhängig ändern miteinander sprechen.

  1. AlbumControllerFactory genannt wird und erhalten ist die abhängige AlbumTable Service ($container->get(AlbumTable::class);), die dann die dann AlbumTableFactory
  2. AlbumTableFactory auslöst, wird der Konstruktor Injektion für die AlbumTable Vorbereitung mit $tableGateway = $container->get(AlbumTableGateway::class);
  3. Jetzt habe ich die Logik aus der AlbumTableFactory kombiniert und die AlbumTableGatewayFactory in eine AbstractFactoryInterface (Ich habe die AlbumTableGatewayFactory komplett entfernt)
// 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

Stellen Sie sicher, Zend\Db\Adapter\AdapterAbstractServiceFactory zum abstract_factories Array der Servicemanager Konfiguration hinzugefügt haben. Diese abstrakte Factory ist für die Instanziierung der einzelnen Datenbankadapter zuständig. Überprüfen Sie auch, ob Ihre Album\Model\AlbumTable Factory den Datenbankadapter mit dem korrekten Namen abruft.

+0

danke für Ihre Antwort. Ich habe meine Post bearbeitet – rogaa

+0

Vergessen Sie nicht, dass 'Zend \ Db' Modul muss auch installiert werden. Es ist nicht standardmäßig in Zend Framework 3 enthalten. –