zend 实现多数据库却换

转载请注明出处,尊重原创: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类,实例化的适配器就是根据参数实例化的正确的适配器了。

时间有点赶,写得不好,有疑问或者更好的实现,欢迎拍砖!



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟没翅膀

你的打赏是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值