zend tutorial framework español docs create composer php zend-framework2

php - tutorial - configurar múltiples bases de datos en zf2



zend framework download (2)

¿Cómo puedo configurar (y usar) múltiples bases de datos en Zend Framework 2? Actualmente tengo esto en mi global.php:

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

Pero no veo una forma de añadir una segunda.


Encontré una explicación mucho mejor en https://samsonasik.wordpress.com/2013/07/27/zend-framework-2-multiple-named-db-adapter-instances-using-adapters-subkey/

Zend Framework 2.2 viene con abstract_factories Zend/Db/Adapter/AdapterAbstractServiceFactory que nos permite configurar varias instancias de adaptador de base de datos con nombre. Esto es paso a paso para hacerlo:

  1. Registre Zend/Db/Adapter/AdapterAbstractServiceFactory en el tipo ''abstract_factories'' debajo de la tecla ''service_manager''.

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

  2. Configure la subclave ''adaptadores'' debajo de la clave ''db'' en config/autoload/global.php

//config/autoload/global.php // .... parte de 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/''' ), ), ), ),

  1. Configure la subclave ''adaptadores'' bajo la tecla ''db'' en 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. Adaptador de llamadas que usa ''db1'' o ''db2'' como adaptador db de ServiceManager

    $ sm-> get (''db1'');

    $ sm-> get (''db2'');

Si necesita obtener $sm->get(''Zend/Db/Adapter/Adapter'') como adaptador primario, ''db1'' y ''db2'' como otro adaptador para propósitos específicos, entonces necesita definir el adaptador primario directamente en db, por lo que la configuración de config/autoload/global.php será como la siguiente:

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

La config/autoload/global.local.php debe configurarse de la siguiente manera:

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


Si observa la Zend / Db / Adapter / AdapterServiceFactory, verá que la configuración de su adaptador apunta a solo una clave ''db'' . Lo que significa que el adaptador que construye siempre usará esta clave de configuración (única).

Te recomiendo crear tu propia fábrica que se vería así:

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

En su módulo principal (o en cualquier otro), agregue lo siguiente al archivo Module.php para declarar las fábricas de adaptadores al 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 configuración global ahora debería verse como:

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

para usar los adaptadores que necesita para llamarlos usando el administrador de servicios:

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

A partir de la versión 2.2

Una Abstract Service Factory ahora es parte del módulo zf2 Zend / Db. Es posible agregar múltiples claves de configuración bajo la subclave ''adaptadores'':

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

Sin embargo, el AbstractServiceFactory debe agregarse "manualmente" ya que no es así de manera predeterminada:

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

Los adaptadores son accesibles como anteriormente:

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

Desde una perspectiva de rendimiento, este segundo enfoque es mejor: se creará una instancia de un objeto (la fábrica abstracta) para (potencialmente) crear los diferentes adaptadores. Mientras que en el enfoque anterior, se creó un objeto por configuración.