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

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