Zend Framework应用多数据库分析

可以从ini配置文件中读取到数据库的配置,然后去设置成表的适配器

比如配置文件为:

[databases]
db.news.adapter = PDO_MYSQL
db.news.config.host = 192.168.1.115
db.news.config.username = root
db.news.config.password = 123456
db.news.config.dbname = news
db.news.config.port = 3306

db.user.adapter = PDO_MYSQL
db.user.config.host = 192.168.1.116
db.user.config.username = vhost
db.user.config.password = 123456
db.user.config.dbname = user
db.user.config.port = 3306


在index.php中获取到配置文件中的数据

$databasese = new Zend_Config_Ini('./application/config/db.ini','databases');


然后将这些数据去设置表的默认适配器,就是说将几个数据库放到这个项目中来,以供使用。代码如下:

foreach($databases->db as $config_name => $db){
    $dbAdapters[$config_name] = Zend_Db::factory($db->adapter,
    $db->config->toArray());
    if((boolean)$db->default){
        Zend_Db_Table::setDefaultAdapter($dbAdapters[$config_name]);
    }
}

当然,这里不用配置文件,你用数组去定义数据库的配置数据也一样可以。这里的意义在于将若干个数据库配置到项目中来,接下来就需要在实际需要中选择对应的数据库。

针对每个model文件,需要去继承一个抽象类,这个抽象类就将确定你这个model连接到哪个数据库。

在model文件中,添加一个protected $_use_adapter = ' * ';在抽象类中用这个值去确定用哪个数据库。

abstract class AppDbTable extends Zend_Db_Table
{
        function AppDbTable($config = null){
                 if(isset($this->_use_adapter)){
                  $dbAdapters = Zend_Registry::get("dbAdapters");
                 $config = ($dbAdapters[$this->_use_adapter]);
                 
                 $config->query('SET NAMES UTF8');
                 
                }
                   return parent::__construct($config);
              }
}

至于最终的Zend_Db_Table参见 http://framework.zend.com/manual/1.12/zh/zend.db.table.html 的解释。注意抽象类,所以不能直接实例 化,只能先继承该类,然后实例化子类。还有,跟与类同名的方法,会被当成构造方法。所以这个抽象类中没有直接的构造方法。

以上的解释为:model需要连接数据库,就得先知道要连哪个数据库,一个中间人把这个再去给连接一下给model使用。

最终model类是这个样子:

class Type extends AppDbTable 
{
    protected $_name ="news_type";
    protected $_primary = 'id';
    protected $_use_adapter = 'news';
    ......
}
 

中间加一层继承AppDbTable类的子类,在里面添加一些model公用的一些方法,这样设计会比较好。

 

同样的解决办法,英文版:http://hi.baidu.com/weimade/item/d0cbfd5d090cfe454fff2077

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章