在zf2中配置多个数据库

如何在Zend Framework 2中配置(和使用)多个数据库?目前,我在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',

),

),

);

但是我看不到添加第二种方法。

回答:

如果查看Zend \ Db \ Adapter \

AdapterServiceFactory,您会看到适配器配置仅指向一个键'db'。这意味着它构建的适配器将始终使用此(唯一)配置密钥。

我建议您创建自己的工厂,如下所示:

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

}

}

在您的主模块(或任何其他模块)中,将以下内容添加到Module.php文件中,以将适配器工厂声明为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'),

),

);

}

//...

现在,全局配置应如下所示:

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

),

);

要使用适配器,您需要使用服务管理器来调用它们:

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

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

从2.2版开始

现在,抽象服务工厂已成为zf2 Zend \ Db模块的一部分。可以在“ adapters”子键下添加多个配置键:

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

),

)

),

但是,需要“手动”添加AbstractServiceFactory,因为默认情况下并非如此:

'service_manager' => array(

'abstract_factories' => array(

'Zend\Db\Adapter\AdapterAbstractServiceFactory',

)

),

可以像以前一样访问适配器:

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

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

从性能角度来看,第二种方法更好:将实例化一个对象(抽象工厂)以(可能)创建不同的适配器。而在以前的方法中,每个配置创建一个对象。

以上是 在zf2中配置多个数据库 的全部内容, 来源链接: utcz.com/qa/415848.html

回到顶部