2012-12-22 24 views
27

Come posso configurare (e utilizzare) più database in Zend Framework 2? Attualmente ho questo nel mio global.php:configurare più database in 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', 
     ), 
    ), 
); 

Ma non vedo un modo per aggiungere una seconda.

risposta

50

Se si guarda Zend \ Db \ Adapter \ AdapterServiceFactory, si noterà che la configurazione dell'adattatore punta a una sola chiave 'db'. Ciò significa che l'adattatore che costruisce utilizzerà sempre questa chiave di configurazione (unica).

vi consiglio di creare il proprio stabilimento che sarebbe simile a questa:

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

Nel vostro modulo principale (o qualsiasi altro), aggiungere il seguente al file Module.php per dichiarare gli adattatori fabbriche alla 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'), 
      ), 
     ); 

} 

//... 

la configurazione globale dovrebbe apparire come:

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

); 

utilizzare gli adattatori necessari per chiamare utilizzando la Service Manager:

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

A partire dalla versione 2.2

Un Abstract Service Factory è ora parte del ZF2 modulo di Zend \ Db. È possibile aggiungere chiavi di configurazione multipli sotto la sotto-chiave 'schede':

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

Tuttavia, la necessità AbstractServiceFactory da aggiungere "manualmente" in quanto non è così per default:

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

Gli adattatori sono accessibili come precedentemente:

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

Dal punto di vista delle prestazioni questo secondo approccio è meglio: un oggetto sarà istanziata (fabbrica abstract) a (potenzialmente) creat e i diversi adattatori. Mentre nell'approccio precedente, è stato creato un oggetto per configurazione.

+0

ha questo tipo di strategia di cambiata a 2,1? – Saeven

+0

Dopo un rapido sguardo su Zend \ Db \ Adapter \ AdapterServiceFactory non penso. – yechabbi

+8

Nice 2.2 informazioni, grazie. – Xunnamius

3

ho trovato molto meglio spiegazione sul https://samsonasik.wordpress.com/2013/07/27/zend-framework-2-multiple-named-db-adapter-instances-using-adapters-subkey/

Zend Framework 2.2 viene fornito con abstract_factories Zend\Db\Adapter\AdapterAbstractServiceFactory che ci permettono di configurare più istanze dell'adattatore DB denominate. Questo è passo dopo passo per farlo:

  1. Registrati Zend\Db\Adapter\AdapterAbstractServiceFactory al tipo ‘abstract_factories’ sotto chiave ‘service_manager’.

    //config/autoload/global.php // .... parte di config/autoload/global.php 'service_manager' => array ( 'abstract_factories' => array ( 'Zend \ Db \ Adapter \ AdapterAbstractServiceFactory', ), ),

  2. sottochiave

    Configurazione 'schede' sotto chiave 'db' a config/autoload/global.php

//config/autoload/global.php // .... parte di 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\'' 
      ), 
     ), 
    ), 
), 
    sottochiave
  1. Configura 'adattatori' sotto chiave 'db' a 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. adattatore chiamata usando 'db1' o 'db2' come adattatore db da ServiceManager

    $ SM-> get ('db1');

    $ sm-> get ('db2');

Se avete bisogno di ottenere $sm->get(‘Zend\Db\Adapter\Adapter’) adattatore come primaria, 'db1' e 'db2' come un altro adattatore per scopo specifico, allora avete bisogno di definire adattatore primario direttamente sotto db, quindi la configurazione di config/autoload/global.php sarà come il seguente:

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

il config/autoload/global.local.php deve essere configurato anche come la seguente:

012.351.

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