转载请注明出处,尊重原创: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类,实例化的适配器就是根据参数实例化的正确的适配器了。
时间有点赶,写得不好,有疑问或者更好的实现,欢迎拍砖!