How can I configure (and use) multiple databases in Zend Framework 2? Currently I have this in my 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',
),
),
);
But I do not see a way to add a second one.
I found much better explaination on https://samsonasik.wordpress.com/2013/07/27/zend-framework-2-multiple-named-db-adapter-instances-using-adapters-subkey/
Zend Framework 2.2 comes with abstract_factories
Zend\Db\Adapter\AdapterAbstractServiceFactory
that allow us to configure multiple named DB adapter instances. This is step by step to do it :Register
Zend\Db\Adapter\AdapterAbstractServiceFactory
at ‘abstract_factories’ type under ‘service_manager’ key.//config/autoload/global.php //.... part of config/autoload/global.php 'service_manager' => array( 'abstract_factories' => array( 'Zend\Db\Adapter\AdapterAbstractServiceFactory', ), ),
Configure ‘adapters’ subkey under ‘db’ key at
config/autoload/global.php
//config/autoload/global.php //.... part of config/autoload/global.php
config/autoload/local.php
//config/autoload/local.php
Call adapter using ‘db1’ or ‘db2’ as db adapter from ServiceManager
$sm->get('db1');
$sm->get('db2');
If you need to get
$sm->get(‘Zend\Db\Adapter\Adapter’)
as primary adapter, ‘db1’ and ‘db2’ as other adapter for specific purpose, then you need to define primary adapter directly under db, so the configuration ofconfig/autoload/global.php
will be like the following ://config/autoload/global.php
The
config/autoload/global.local.php
should be configured too like the following ://config/autoload/local.php
If you look at the Zend\Db\Adapter\AdapterServiceFactory, you'll see that your adapter configuration points to only one key
'db'
. Which means that the Adapter that it builds will always use this (unique) configuration key.I recommend you to create your own factory that would look like this :
In your main module (or any other one), add the following to the Module.php file to declare the adapters factories to the Zend Service Manager:
The global config should now look like:
to use the adapters you need to call them using the Service Manager:
As of version 2.2
An Abstract Service Factory is now part of the zf2 Zend\Db module. It is possible to add multiples configuration keys under the 'adapters' sub-key :
However, the AbstractServiceFactory need to be added "manually" as it isn't so by default :
The adapters are accessible as previously :
From a performance perspective this second approach is better : One object will be instantiated (The abstract factory) to (potentially) create the different adapters. Whereas in the previous approach, one object per configuration was created.