转载请注明出处,尊重原创:http://blog.csdn.net/a437629292/article/details/41121455,谢谢!
一、 需求
用户数据库:实现可配置
业务数据库:多个业务数据库却换使用,不同数据库数据隔离;
二、实现:
第一: 首先思路:
1. 实现数据库配置简单,在serverConfig.ini里配置个节点,实例化数据库适配器时,根据配置的节点去读取就OK
2. 多数据库却换,无非也就是在serverConfig.ini里配置多个数据库节点,然后根据参数去 读serverConfig.ini里的不同节点去实例化不同的数据库适配器。
第二:具体代码实现
1. 首先看我的serverConfig.ini的配置:
[SinoStorageData]
db.adapter = PDO_MYSQL
db.params.host = 127.0.0.1:3306
db.params.username = root
db.params.password = root
db.params.dbname = SinoStorageData
[sinostorage_105]
db.adapter = PDO_MYSQL
db.params.host = 127.0.0.1:3306
db.params.username = root
db.params.password = root
db.params.dbname = sinostorage_105
[userCentre]
db.adapter = PDO_MYSQL
db.params.host = 127.0.0.1:3306
db.params.username = root
db.params.password = root
db.params.dbname = sinoStorCentre
代码解析:
我们看serverConfig.ini文件内容,配置了三个节点:第一个是SinoStorageData数据库的配置信息,第二个是sinostorage_105数据库配置信息,第三个是: userCentre用户数据库中心的配置信息。
看到这里应该没有什么问题吧?
2. 所有的model都不是直接继承Zend_Db_Table,而是自己定义的一个MyCenter_Zend_Db_Table类,我们先看该类的实现:
<?php
require_once 'Zend/Db/Table.php';
/**
* 实例化数据库适配器选择类
* 用户中心数据库在配置文件里必须配置在userCentre下,并且保证只有一个userCentre节点
* @author Administrator
*
*/
class MyCenter_Zend_Db_Table extends Zend_Db_Table {
function MyCenter_Zend_Db_Table($config = null) {
try{
MarkAdapter::makeAdapter ( 'userCentre' );
return parent::__construct ( $config );
}catch (Exception $e){
return null;
}
}
}
这个是我的用户中心数据库用来统一实例化数据库适配器的类,该类继承Zend_Db_Table,然后再该类里实例化数据库适配器,只要你修改serverConfig.ini文件里的userCentre节点下的数据库配置,就能成功却换到其他用户中心库里去。
里面有一个MarkAdapter::makeAdapter方法,其实就是简单的实例化数据库适配器的,代码如下:
<?php
class MarkAdapter {
public static function makeAdapter($databaseName){
//加载配置文件
$config=new Zend_Config_Ini(APPLICATION_PATH.'/configs/serverConfig.ini',$databaseName);
$registry=Zend_Registry::getInstance();
$registry->set('config',$config);
//配置数据库
$db=Zend_Db::factory($config->db); //实例化一个合适的数据库适配器
$db->query("set names utf8");
Zend_Db_Table::setDefaultAdapter($db);
}
}
例外一个数据库适配器实例化选择类代码如下:
<?php
require_once 'Zend/Db/Table.php';
class My_Zend_Db_Table extends Zend_Db_Table {
function My_Zend_Db_Table($config = null) {
try{
MarkAdapter::makeAdapter ( $_SESSION['userBase']['databaseName'] );
return parent::__construct ( $config );
}catch (Exception $e){
return null;
}
}
}
看到$_SESSION['userBase']['databaseName']也不难理解,我的做法是:在登录的时候选择你要使用的仓库
然后登录时使用到的用户中心库里的所以表都会根据他们继承的MyCenter_Zend_Db_Table类来实例化数据库适配器。
并且在登录成功以后,把这里选择的仓库,把不同的参数保存到session对象里,这样,在使用到仓库数据库model时,都是继承的My_Zend_Db_Table类,实例化的适配器就是根据参数实例化的正确的适配器了。
时间有点赶,写得不好,有疑问或者更好的实现,欢迎拍砖!