朱金辉 1 год назад
Родитель
Сommit
55b5de8e79
5 измененных файлов с 35 добавлено и 22 удалено
  1. 12 5
      src/Autoloader/Psr4.php
  2. 1 0
      src/Config/Register.php
  3. 3 3
      src/Driver/ConnBase.php
  4. 9 4
      src/Driver/Model.php
  5. 10 10
      src/Driver/Pdo/Connection.php

+ 12 - 5
src/Autoloader/Psr4.php

@@ -463,20 +463,27 @@ class Psr4
         $className = $this->getClassName($class);
         //如果实例化的参数发生变化,就重新实例化
         $paramsHash = md5(print_r($args, true));
-        if (isset(self::$_loadedClass[$className]) && isset(self::$_loadedClassParams[$className])
-            && self::$_loadedClassParams[$className] == $paramsHash) return self::$_loadedClass[$className];
-        
-        self::$_loadedClassParams[$className] = $paramsHash;
+        if (isset(self::$_loadedClass[$className .'-'. $paramsHash])) return self::$_loadedClass[$className  .'-'. $paramsHash];
+        self::$_loadedClassParams[$className][] = $paramsHash;
 
         if (!class_exists($className, false)) {
             throw new CallUndefinedClass(\Qii::i('1105', $className), __LINE__);
         }
         $refClass = new \ReflectionClass($className);
-        self::$_loadedClass[$className] = $instance = $refClass->newInstanceArgs($args);
+        self::$_loadedClass[$className .'-'. $paramsHash] = $instance = $refClass->newInstanceArgs($args);
         //如果有_initialize方法就自动调用_initialize方法,并将参数传递给_initialize方法
         if ($refClass->hasMethod('_initialize')) {
             call_user_func_array(array($instance, '_initialize'), $args);
         }
         return $instance;
     }
+
+    /**
+     * 查看当前已经初始化的数据
+     * 
+     * @return array
+     */
+    public static function getloadedClass() {
+        return ['class' => array_keys(self::$_loadedClass), 'params' => self::$_loadedClassParams];
+    }
 }

+ 1 - 0
src/Config/Register.php

@@ -231,6 +231,7 @@ class Register
         $cacheName = Register::getCacheName($iniFile);
         $config = self::array_merge_recursive_distinct($config, $array);
         Register::set($cacheName, $config);
+        return $config;
     }
 
 	/**

+ 3 - 3
src/Driver/ConnBase.php

@@ -40,7 +40,7 @@ class ConnBase
 
 	/**
 	 * 通过sql语句判断是读还是写操作
-	 * @param $sql  读/写的sql语句
+	 * @param string $sql  读/写的sql语句
 	 */
 	protected function prepare($sql)
 	{
@@ -66,10 +66,10 @@ class ConnBase
 		if (isset($this->_connections[$default])) return $this->_connections[$default];
 		switch ($default) {
 			case 'READ':
-				$connection = $this->_connections['READ'] = $this->getReadConnection();
+                $this->_connections['READ'] = $connection = $this->getReadConnection();
 				break;
 			default:
-                $connection = $this->_connections['WRITE'] = $this->getWriteConnection();
+                $this->_connections['WRITE'] = $connection = $this->getWriteConnection();
 				break;
 		}
 

+ 9 - 4
src/Driver/Model.php

@@ -5,6 +5,7 @@ use Qii\Autoloader\Import;
 use Qii\Autoloader\Psr4;
 use Qii\Config\Consts;
 use Qii\Config\Register;
+use Qii\Exceptions\Variable;
 
 /**
  * 数据库分发器
@@ -72,13 +73,17 @@ class Model
      */
     protected $_helper;
 
-    public function __construct()
+    public function __construct($dbInfo = array())
     {
+        if(!is_array($dbInfo)) {
+            throw new Variable('配置信息必须为数组');
+        }
         $this->_load = Psr4::getInstance()->loadClass('\Qii\Autoloader\Loader');
         $this->_language = Psr4::getInstance()->loadClass('\Qii\Language\Loader');
         $this->_request = Psr4::getInstance()->loadClass('Qii\Request\Http');
         $this->_helper = Psr4::getInstance()->loadClass('Qii\Autoloader\Helper');
-        $this->_dbInfo = Register::getAppConfigure(Register::get(Consts::APP_DB));
+        Register::mergeAppConfigure(Register::getAppConfigure(Consts::APP_DB), $dbInfo);
+        $dbInfo = Register::getAppConfigure(Register::get(Consts::APP_DB));
         if (isset($this->_dbInfo['driver'])) {
             $this->_driver = $this->_dbInfo['driver'];
         }
@@ -95,10 +100,10 @@ class Model
         $this->db = Psr4::getInstance()->loadClass(
             '\Qii\Driver\\' . ucWords($this->_driver) . '\Driver',
             Psr4::getInstance()->loadClass(
-                '\Qii\Driver\\' . ucWords($this->_driver) . '\Connection'
+                '\Qii\Driver\\' . ucWords($this->_driver) . '\Connection', $dbInfo
             )
         );
-        $this->db->_debugSQL = isset($this->_dbInfo['debug']) ? $this->_dbInfo['debug'] : false;
+        $this->db->_debugSQL = isset($dbInfo['debug']) ? $dbInfo['debug'] : false;
         return $this;
     }
 

+ 10 - 10
src/Driver/Pdo/Connection.php

@@ -16,8 +16,9 @@ class Connection extends ConnBase implements ConnIntf
 {
 	const VERSION = '1.2';
 
-	public function __construct()
+	public function __construct($dbInfo = array())
 	{
+        Register::mergeAppConfigure(Register::getAppConfigure(Consts::APP_DB), $dbInfo);
 		$this->_dbInfo = Register::getAppConfigure(Register::get(Consts::APP_DB));
 		if(!isset($this->_dbInfo['use_db_driver'])) $this->_dbInfo['use_db_driver'] = 'mysql';
 	}
@@ -28,10 +29,10 @@ class Connection extends ConnBase implements ConnIntf
 	 */
 	public function getReadConnection()
 	{
-        if (self::$_readConnection != null) {
-            return self::$_readConnection;
-        }
         list($dbInfo, $useSlave) = $this->getDBInfoAndSalve();
+        if (self::$_readConnection[$dbInfo['db']] != null) {
+            return self::$_readConnection[$dbInfo['db']];
+        }
 		if ($useSlave) {
 			try {
 				if ($this->_dbInfo['use_db_driver'] == 'mssql') {
@@ -39,8 +40,7 @@ class Connection extends ConnBase implements ConnIntf
 				} else {
 					$dsn = $this->_dbInfo['use_db_driver'] . ":host=" . $dbInfo['host'] . ";dbname=" . $dbInfo['db'];
 				}
-				self::$_readConnection = new \PDO($dsn, $dbInfo['user'], $dbInfo['password']);
-                return self::$_readConnection;
+				return self::$_readConnection[$dbInfo['db']] = new \PDO($dsn, $dbInfo['user'], $dbInfo['password']);
 			} catch (Exception  $e) {
 				return $this->getWriteConnection();
 			}
@@ -54,17 +54,17 @@ class Connection extends ConnBase implements ConnIntf
 	 */
 	public function getWriteConnection()
 	{
-	    if (self::$_writeConnection != null) {
-	        return self::$_writeConnection;
+        $dbInfo = $this->_dbInfo['master'];
+	    if (self::$_writeConnection[$dbInfo['db']] != null) {
+	        return self::$_writeConnection[$dbInfo['db']];
         }
-		$dbInfo = $this->_dbInfo['master'];
 		try {
 			if ($this->_dbInfo['use_db_driver'] == 'mssql') {
 				$dsn = 'odbc:Driver={SQL Server};Server=' . $dbInfo['host'] . ';Database=' . $dbInfo['db'] . ';';
 			} else {
 				$dsn = $this->_dbInfo['use_db_driver'] . ":host=" . $dbInfo['host'] . ";dbname=" . $dbInfo['db'];
 			}
-			return self::$_writeConnection = new \PDO($dsn, $dbInfo['user'], $dbInfo['password']);
+			return self::$_writeConnection[$dbInfo['db']] = new \PDO($dsn, $dbInfo['user'], $dbInfo['password']);
 		} catch (Exception  $e) {
 			throw new Errors(\Qii::i(1500, $dbInfo['host'], $dbInfo['user'], $dbInfo['password'], $dbInfo['db'], toUTF8($e->getMessage())), __LINE__);
 		}