En muchos de nuestros proyectos, la fuente de datos es una sola base de datos, pero qué pasa cuando la fuente de datos proviene de varias bases de datos?.
Nuestros desarrollos están basados en Zend Framework en donde tenemos integrado Doctrine como ORM.
¿Permite Doctrine la conexión a dos o más bases de datos?
La respuesta es clara, SI. Solamente tenemos que añadir la configuración necesaria a nuestro proyecto para que Doctrine tenga claro donde tiene que ir a buscar la información. Para ello explicamos como nosotros configuramos nuestros proyectos para conseguir esto.
1. Configuración conexión Doctrine
En el fichero doctrine.local.php tendrás que añadir la configuración de las conexiones de tus base de datos:
'connection' => array(
'orm_default' => array(
'params' => array(
'host' => 'HOSTBBDD1',
'port' => PORT,
'user' => 'USERBBDD1',
'password' => 'PASSWORDBBDD1',
'dbname' => 'DBNAME1'
)
),
'orm_alternative' => array(
'params' => array(
'host' => 'HOSTBBDD2',
'port' => PORT,
'user' =>'USERBBDD2',
'password' => 'PASSWORDBBDD2',
'dbname' => 'DBNAME2'
)
)
)
Además de la configuración de las conexión tendrás que indicarle a Doctrine toda la configuración complementaria para la segunda conexión de la base de datos:
'entitymanager' => array(
'orm_default' => array(
'connection' => 'orm_default',
'configuration' => 'orm_default'
),
'orm_alternative' => array(
'connection' => 'orm_alternative',
'configuration' => 'orm_alternative'
)
),
'configuration' => array(
'orm_default' => array(
'metadata_cache' => 'array',
'query_cache' => 'array',
'result_cache' => 'array',
'hydration_cache' => 'array',
'generate_proxies' => true,
),
'orm_alternative' => array(
'metadata_cache' => 'array',
'query_cache' => 'array',
'result_cache' => 'array',
'hydration_cache' => 'array',
'generate_proxies' => true,
),
)
Una vez Doctrine ya se pueda conectar a las base de datos, Zend Framework te lo ofrecerá a través de servicios, que tendrás que introducir en tus controladores. Esto lo tendrás que realizar a través de las factorías llamando a estos servicios e incluirlos en el controlador.
public function createService(ServiceLocatorInterface $serviceLocator)
{
$serviceLocator = $serviceLocator->getServiceLocator();
// Conexión para la base de datos principal
$entityManager = $serviceLocator->get('doctrine.entitymanager.orm_default');
// Conexión para la segunda base de datos
$entityManagerAlternative = $serviceLocator->get('doctrine.entitymanager.orm_alternative');
$controller = new YourController( $entityManager, $entityManagerAlternative );
return $controller;
}
Una vez lo tengas en tu controlador ya podrás acceder a la información que necesites utilizado una conexión u otra.