ZF2 預設單資料庫,多資料庫場景需手動管理適配器。本文方案:在 public/index.php 入口文件統一實例化所有資料庫適配器,存入 Zend_Registry,Model 中按需獲取。
configs/serverConfig.ini 所有資料庫節點。Zend_Db::factory() 創建適配器,存入 $dbAdapters[dbname]。default = 1,設為默認適配器 Zend_Db_Table::setDefaultAdapter()。$dbAdapters 與配置陣列存入 Registry,全局可訪問。// 實例化所有資料庫適配器
$configs = new Zend_Config_Ini(APPLICATION_PATH . '/configs/serverConfig.ini');
$dbAdapters = array();
$configArray = array();
$registry = Zend_Registry::getInstance();
foreach ($configs as $config) {
$databaseName = $config->db->params->dbname;
$configArray[$databaseName] = $config;
$registry->set('configArray', $configArray);
// 配置並實例化資料庫
$db = Zend_Db::factory($config->db);
$db->query("SET NAMES utf8");
$dbAdapters[$databaseName] = $db;
// 兼容舊版寫法
$dbAdapters[$databaseName] = Zend_Db::factory(
$config->db->adapter,
$config->db->params->toArray()
);
if (($config->db->params->default) == 1) {
Zend_Db_Table::setDefaultAdapter($db);
}
}
$registry->set('dbAdapters', $dbAdapters);
[proManager] db.adapter = PDO_MYSQL db.params.host = 127.0.0.1:3306 db.params.username = root db.params.password = root db.params.dbname = proManager db.params.default = 0 [proManager1] db.adapter = PDO_MYSQL db.params.host = 127.0.0.1:3306 db.params.username = root db.params.password = root db.params.dbname = proManager1 db.params.default = 1
class MyModel extends Zend_Db_Table_Abstract {
protected $_name = 'my_table';
public function setDb($dbName) {
$registry = Zend_Registry::getInstance();
$adapters = $registry->get('dbAdapters');
$this->_setAdapter($adapters[$dbName]);
}
}
setDb() 靈活切換資料庫。ServiceManager + DbAdapter 服務工廠,但本法在遷移舊項目或簡單場景下依然實用。此方案展示了 ZF2 早期版本中多資料庫管理的實用模式,體現「配置驅動、啟動時綁定、運行時查找」的架構思想。