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