2012-12-22 22 views
27

Jak mogę skonfigurować (i używać) wielu baz danych w Zend Framework 2? Obecnie mam to w moim global.php:konfigurowanie wielu baz danych w Zf2

return array(
    'db' => array(
     'driver'   => 'Pdo', 
     'dsn'   => 'mysql:dbname=my_db;host=localhost', 
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
     ), 
     'username' => 'user', 
     'password' => '******', 
    ), 
    'service_manager' => array(
     'factories' => array(
      'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 
     ), 
    ), 
); 

Ale nie widzę sposobu na dodanie drugiego.

Odpowiedz

50

Jeśli spojrzysz na Zend \ Db \ Adapter \ AdapterServiceFactory, zobaczysz, że konfiguracja Twojego adaptera wskazuje tylko jeden klucz 'db'. Oznacza to, że adapter, który tworzy, zawsze będzie używał tego (unikalnego) klucza konfiguracyjnego.

polecam Ci stworzyć własną fabrykę, która będzie wyglądać następująco:

namespace Your\Namespace; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\Db\Adapter\Adapter; 

class MyAdapterFactory implements FactoryInterface 
{ 

    protected $configKey; 

    public function __construct($key) 
    { 
     $this->configKey = $key; 
    } 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $config = $serviceLocator->get('Config'); 
     return new Adapter($config[$this->configKey]); 
    } 
} 

w głównym module (lub jakikolwiek inny), dodaj poniższe do pliku Module.php zadeklarować fabryki adapterów do Zend Service Manager:

use Your\Namespace\MyAdapterFactory; 
use Zend\ModuleManager\Feature\ServiceProviderInterface; 

class Module implements ServiceProviderInterface{ 

//Previous code 

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'myadapter1'  => new MyAdapterFactory('dbconfigkey1'), 
      'myadapter2'  => new MyAdapterFactory('dbconfigkey2'), 
      ), 
     ); 

} 

//... 

globalna konfiguracja powinna wyglądać następująco:

return array(
'dbconfigkey1' => array(
    'driver'   => 'Pdo', 
    'dsn'   => 'mysql:dbname=my_db;host=localhost', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ), 
    'username' => 'user', 
    'password' => '******', 
), 

'dbconfigkey2' => array(
    'driver'   => 'Pdo', 
    'dsn'   => 'mysql:dbname=my_db2;host=localhost', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ), 
    'username' => 'user', 
    'password' => '******', 
), 

); 

używać adapterów musisz zadzwonić do nich za pomocą Service Manager:

$adapter1=$serviceManager->get('myadapter1'); 
$adapter2=$serviceManager->get('myadapter2'); 

Począwszy od wersji 2.2

Abstracts Service Factory jest teraz częścią ZF2 modułu Zend \ Db. Możliwe jest dodawanie przycisków konfiguracyjnych wielokrotności pod klucz „sub-adaptery”:

'db'=> array(
    'adapters'=>array(
     'adapter' => array(
      'driver'   => 'Pdo', 
      'dsn'   => 'mysql:dbname=test;host=localhost', 
      'username' => 'readCredential', 
      'password' => '****' 
     ), 
     'adapter2' => array(
      'driver'   => 'Pdo', 
      'dsn'   => 'mysql:dbname=test;host=localhost', 
      'username' => 'rwCredential', 
      'password' => '****' 
     ), 
    ) 
), 

Jednak AbstractServiceFactory muszą być dodane „ręcznie”, ponieważ nie jest tak domyślnie:

'service_manager' => array(
    'abstract_factories' => array(
      'Zend\Db\Adapter\AdapterAbstractServiceFactory', 
    ) 
), 

Adaptery są dostępne, jak poprzednio:

$adapter1=$serviceManager->get('adapter'); 
$adapter2=$serviceManager->get('adapter2'); 

z punktu widzenia wydajności to drugie podejście jest lepsze: jeden obiekt zostanie instancja (The abstract factory) do (potencjalnie) cREAT e różne adaptery. Podczas gdy w poprzednim podejściu został utworzony jeden obiekt na konfigurację.

+0

Czy tego rodzaju strategii zmieniło w 2.1? – Saeven

+0

Po krótkim spojrzeniu na Zend \ Db \ Adapter \ AdapterServiceFactory nie sądzę. – yechabbi

+8

Nice 2.2 info, thanks. – Xunnamius

3

znalazłem dużo lepsze wyjaśnieniu na https://samsonasik.wordpress.com/2013/07/27/zend-framework-2-multiple-named-db-adapter-instances-using-adapters-subkey/

Zend Framework 2.2 jest wyposażony abstract_factories Zend\Db\Adapter\AdapterAbstractServiceFactory które pozwalają nam skonfigurować wiele instancji adaptera nazwanych DB. Jest to krok po kroku, aby to zrobić:

  1. Rejestracja Zend\Db\Adapter\AdapterAbstractServiceFactory w rodzaju „” pod klucz abstract_factories „service_manager”.

    //config/autoload/global.php // .... część config/autoload/global.php 'service_manager' => array ( 'abstract_factories' => array ( 'Zend \ Db \ adapter \ AdapterAbstractServiceFactory' ) )

  2. podklucz

    konfiguruje 'AdAPTERY' pod klucz 'db' w config/autoload/global.php

//config/autoload/global.php // .... częścią config/autoload/global.php

'db' => array(
    'adapters' => array(

     'db1' => array(
      'driver'   => 'Pdo', 
      'dsn'    => 'mysql:dbname=zf2_staging;host=localhost', 
      'driver_options' => array(
       PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
      ), 
     ), 

     'db2' => array(
      'driver'   => 'Pdo', 
      'dsn'    => 'mysql:dbname=zf2_test;host=localhost', 
      'driver_options' => array(
       PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
      ), 
     ), 
    ), 
), 
    podklucz
  1. konfiguruje 'AdAPTERY' pod klucz 'db' w config/autoload/local.php

//config/autoload/local.php

return array(
    'db' => array(
     'adapters' => array(
      'db1' => array(
       'username' => 'root', 
       'password' => '', 
      ), 
      'db2' => array(
       'username' => 'other_user', 
       'password' => 'other_user_passwd', 
      ), 
     ), 
    ), 
); 
  1. Adapter połączenia używający" db1 "lub" db2 "jako adaptera db od ServiceManager

    $ sm-> get ('db1');

    $ sm-> get ('db2');

Jeśli trzeba dostać $sm->get(‘Zend\Db\Adapter\Adapter’) jako podstawową kartę „DB1” i „db2” jako inny adapter do określonego celu, a następnie trzeba zdefiniować podstawowy adapter bezpośrednio pod db, więc konfiguracja config/autoload/global.php będzie jak następujące:

//config/autoload/global.php

return array(
    'db' => array(
     //this is for primary adapter.... 
     'driver'   => 'Pdo', 
     'dsn'    => 'mysql:dbname=zf21_learn;host=localhost', 
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
     ), 

     //other adapter when it needed... 
     'adapters' => array(

      'db1' => array(
       'driver'   => 'Pdo', 
       'dsn'    => 'mysql:dbname=zf2_staging;host=localhost', 
       'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
       ), 
      ), 
      'db2' => array(
       'driver'   => 'Pdo', 
       'dsn'    => 'mysql:dbname=zf2_test;host=localhost', 
       'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
       ), 
      ), 

     ), 
    ), 
    'service_manager' => array(
     // for primary db adapter that called 
     // by $sm->get('Zend\Db\Adapter\Adapter') 
     'factories' => array(
      'Zend\Db\Adapter\Adapter' 
        => 'Zend\Db\Adapter\AdapterServiceFactory', 
     ), 
     // to allow other adapter to be called by 
     // $sm->get('db1') or $sm->get('db2') based on the adapters config. 
     'abstract_factories' => array(
      'Zend\Db\Adapter\AdapterAbstractServiceFactory', 
     ), 
    ), 
); 

config/autoload/global.local.php powinny być też skonfigurowany tak:

//config/autoload/local.php

return array(
    'db' => array(
     // for primary db adapter that called 
     // by $sm->get('Zend\Db\Adapter\Adapter') 
     'username' => 'root', 
     'password' => '', 

     // to allow other adapter to be called by 
     // $sm->get('db1') or $sm->get('db2') based on the adapters config. 
     'adapters' => array(
      'db1' => array(
       'username' => 'root', 
       'password' => '', 
      ), 
      'db2' => array(
       'username' => 'other_user', 
       'password' => 'other_user_passwd', 
      ), 
     ), 
    ), 
); 
Powiązane problemy