Răsfoiți Sursa

解锁更多的方法

朱金辉 2 ani în urmă
părinte
comite
20a4fa1799

+ 28 - 0
README.md

@@ -263,6 +263,34 @@ composer.json:
 				if($status['code'] === 0) echo '登录成功';
 			}
 		}
+	Model新玩法:
+```
+	class base extends \Qii\Driver\Model {
+		public function __construct()
+		{
+			parent::__construct();
+		}
+		public function demo()
+		{
+			$this->db->fields("*")->join(array("leftJoin", array('table' => 'ad_site', 'alias' => 'b', 'on' => 'a.uid = b.uid')))->where(array('a.create_at:greater' => 1))->limit(10)->groupBy(array('a.uid', 'a.create_at'))->orderBy(array('a.uid' => 'desc'))->selectAll('user a');
+			$this->db->where(array('uid' => 1))->set(array('create_at:plus' => time(), 'status' => 1))->update('user');
+			$this->db->updateObject('user', array('create_at:plus' => time(), 'status' => 1), array('uid' => 1));
+			$this->db->where(array('uid:greater' => 1))->delete('user');
+			$this->db->deleteObject('user', array('uid' => 1));
+			$this->db->where(array('uid:greater' => 1))->like("email like '%test@test.com%'")->selectAll('user');
+			$this->db->where(array('uid:greater' => 1))->where("or")->like(array('email' => 'test@testcom'))->selectAll('user');
+			$this->db->where(array('uid:greater' => 1, 'or', 'email:like' => 'test@test.com'))->selectAll('user');
+			$this->db->where(array('uid:greater' => 1))->where("OR")->like(array('email' => 'test@test.com'))->selectAll('user');
+			$this->db->where(array('name' => 'antsnet'))->exclude(array('email' => 'test@test.com', 'status' => 1))->selectAll('user');
+			$this->db->where(array('name' => 'antsnet'))->or(array('email' => 'test@test.com', 'status' => 1))->selectAll('user');
+			$this->db->or(array('email' => 'test@test.com', 'status' => 1))->selectAll('user');
+			$this->db->join(array("leftJoin", array("table" => 'table', 'alias' => 'a', 'on' => 'a.id=b.id')));
+			$this->db->join(" LEFT JOIN table c on c.id=a.id")->selectAll('use a');
+			$this->db->where(array('email:unequal' => 'test@test.com'))->in(array('uid:in' => array('1,2,3'), 'status' => array(1)))->selectAll('user');
+			$this->db->where(array(array('email:unequal' => 'test@test.com'), array('uid:in' => array('1,2,3'), 'status:in' => array(1))))->selectAll('user');
+		}
+	}
+```
 	7) View的支持
 		view支持smarty及php
 		class index extends \Qii\Controller\Abstract

+ 21 - 15
src/Autoloader/Psr4.php

@@ -85,8 +85,7 @@ class Psr4
     /**
      * Setting is use namespaces for class
      *
-     * @param $prefix 以prefix前缀开头的使用namespace
-     * @param bool $useNamespace
+     * @param array $arr
      * @return object $this
      */
     public function setUseNamespaces($arr)
@@ -104,7 +103,7 @@ class Psr4
     /**
      * Setting is use namespace for class
      *
-     * @param $prefix 以prefix前缀开头的使用namespace
+     * @param string $prefix 以prefix前缀开头的使用namespace
      * @param bool $useNamespace
      * @return object $this
      */
@@ -162,7 +161,7 @@ class Psr4
         if ($prepend) {
             array_unshift($this->prefixes[$prefix], $baseDir);
         } else {
-            array_push($this->prefixes[$prefix], $baseDir);
+            $this->prefixes[$prefix][] = $baseDir;
         }
         return $this;
     }
@@ -209,12 +208,7 @@ class Psr4
      */
     public function getFileByPrefix($fileName)
     {
-        $fileName = str_replace(array('/', '\\'), DS, $fileName);
-        $prefixes = explode(DS, $fileName, 2);
-        $dirs = isset($this->prefixes['workspace\\']) ? $this->prefixes['workspace\\'] : array();
-        if (count($prefixes) == 2) {
-            if (isset($this->prefixes[$prefixes[0]])) $dirs = $this->prefixes[$prefixes[0]];
-        }
+        $dirs = $this->getRealFolderPath($fileName);
         foreach ($dirs as $baseDir) {
             if (is_file($baseDir . DS . $fileName)) {
                 return $baseDir . DS . $fileName;
@@ -230,16 +224,28 @@ class Psr4
      */
     public function getFolderByPrefix($folder)
     {
-        $fileName = str_replace(array('/', '\\'), DS, $folder);
+        $dirs = $this->getRealFolderPath($folder);
+        foreach ($dirs as $baseDir) {
+            return $baseDir . DS . $folder;
+        }
+        return $folder;
+    }
+
+    /**
+     * 获取文件或文件夹的所有可能的路径
+     *
+     * @param string $fileOrFolder 文件/文件夹
+     * @return array|mixed
+     */
+    public function getRealFolderPath(string $fileOrFolder)
+    {
+        $fileName = str_replace(array('/', '\\'), DS, $fileOrFolder);
         $prefixes = explode(DS, $fileName, 2);
         $dirs = isset($this->prefixes['workspace\\']) ? $this->prefixes['workspace\\'] : array();
         if (count($prefixes) == 2) {
             if (isset($this->prefixes[$prefixes[0]])) $dirs = $this->prefixes[$prefixes[0]];
         }
-        foreach ($dirs as $baseDir) {
-            return $baseDir . DS . $folder;
-        }
-        return $folder;
+        return $dirs;
     }
     /**
      * 从Map中获取文件

+ 5 - 7
src/Base/Controller.php

@@ -5,11 +5,9 @@
 
 namespace Qii\Base;
 
+use Qii\Autoloader\Factory;
 use \Qii\Autoloader\Psr4;
 
-use \Qii\Config\Register;
-use \Qii\Config\Consts;
-
 /**
  * Qii_Controller_Abstract class
  * @author Zhu Jinhui
@@ -49,7 +47,7 @@ abstract class Controller
      */
     public $response;
     /**
-     * @var Qii\Driver\xx\Connection
+     * @var \Qii\Driver\xx\Connection
      */
     public $db;
     /**
@@ -57,7 +55,7 @@ abstract class Controller
      */
     public $view;
     /**
-     * @var Qii\Cache\Abslute $cache
+     * @var \Qii\Cache\Abslute $cache
      */
     public $cache;
     /**
@@ -78,8 +76,8 @@ abstract class Controller
         $this->request = Psr4::getInstance()->loadClass('\Qii\Request\Http');
         $this->controllerId = $this->request->controller;
         $this->actionId = $this->request->action;
-        $this->language = \Qii\Autoloader\Factory::getInstance('\Qii\Language\Loader');
-        $this->response = \Qii\Autoloader\Factory::getInstance('\Qii\Base\Response');
+        $this->language = Factory::getInstance('\Qii\Language\Loader');
+        $this->response = Factory::getInstance('\Qii\Base\Response');
         $this->cache = new \stdClass();
         //载入model
         if ($this->enableDB) {

+ 9 - 1
src/Driver/Base.php

@@ -156,7 +156,7 @@ class Base
             throw new \Qii\Exceptions\Variable(_i('Invalid %s format', 'data'), __LINE__);
         }
         $this->modelSQL = $sql = "INSERT INTO " . $this->getTable($table) . "(`" . join("`, `", $replaceObj['fields']) . "`) VALUES('" . join("', '", $replaceObj['values']) . "')";
-        $rs = $this->setQuery($sql);
+        $this->setQuery($sql);
         $this->setError();
         return $this->lastInsertId();
     }
@@ -474,6 +474,14 @@ class Base
         return $this;
     }
 
+    /**
+     * in 条件
+     * @param $where
+     * @param $defaultOperater
+     * @param $res
+     * @return $this
+     * @throws \Exception
+     */
     public function in($where, $defaultOperater = 'or', &$res = null)
     {
         if(!is_array($where))

+ 19 - 14
src/Exceptions/Errors.php

@@ -2,6 +2,10 @@
 
 namespace Qii\Exceptions;
 
+use Qii\Autoloader\Import;
+use Qii\Autoloader\Psr4;
+use Qii\Config\Register;
+
 if (class_exists('\Qii\Exceptions\Errors', false)) {
     return;
 }
@@ -18,8 +22,6 @@ class Errors extends \Exception
     public static function getRelatePath($cur, $absp)
     {
         //获取路径名
-        $absDirName = dirname($absp);
-        $currentDirName = dirname($cur);
         //去掉左边的"/"
         $absDirName = trim($absp,"/");
         $currentDirName = trim($cur,"/");
@@ -71,27 +73,30 @@ class Errors extends \Exception
         }
         $appConfigure = (array)\Qii::appConfigure();
         
-        $env = \Qii\Config\Register::get(\Qii\Config\Consts::APP_ENVIRON, 'dev');
+        $env = Register::get(\Qii\Config\Consts::APP_ENVIRON, 'dev');
         if ($env == 'product' || (isset($appConfigure['errorPage']) && $appConfigure['errorPage'] && (isset($appConfigure['debug']) && $appConfigure['debug'] == 0))) {
             list($controller, $action) = explode(':', $appConfigure['errorPage']);
             $controllerCls = $controller;
             if(substr($controller, 0, 1) != '\\') {
-                $controllerCls = \Qii\Config\Register::get(\Qii\Config\Consts::APP_DEFAULT_CONTROLLER_PREFIX) . '\\' . $controller;
+                $controllerCls = Register::get(\Qii\Config\Consts::APP_DEFAULT_CONTROLLER_PREFIX) . '\\' . $controller;
             }
             $action = preg_replace('/(Action)$/i', "", $action);
-            $filePath = \Qii\Autoloader\Psr4::getInstance()->searchMappedFile($controllerCls);
+            $filePath = Psr4::getInstance()->searchMappedFile($controllerCls);
             if (!is_file($filePath)) {
                 if ($env == 'product') return '';
-                \Qii\Autoloader\Import::requires(Qii_DIR . DS . 'Exceptions' . DS . 'Error.php');
+                Import::requires(Qii_DIR . DS . 'Exceptions' . DS . 'Error.php');
                 call_user_func_array(array('\Qii\Exceptions\Error', 'index'), array($controller, $action));
                 die();
-            } else {
-                \Qii::getInstance()->request->setControllerName($controller);
-                \Qii::getInstance()->request->setActionName($action);
-                \Qii::getInstance()->dispatcher->setRequest(\Qii::getInstance()->request);
-                \Qii::getInstance()->dispatcher->dispatch($controller, $action, $e);
-                die();
             }
+            \Qii::getInstance()->request->setControllerName($controller);
+            \Qii::getInstance()->request->setActionName($action);
+            //dispatcher是run 的时候初始化,所以这里可能会是空
+            if (\Qii::getInstance()->dispatcher == null) {
+                \Qii::getInstance()->setDispatcher();
+            }
+            \Qii::getInstance()->dispatcher->setRequest(\Qii::getInstance()->request);
+            \Qii::getInstance()->dispatcher->dispatch($controller, $action, $e);
+            die();
         }
         ob_start();
         include(join(DS, array(Qii_DIR, 'Exceptions', 'View', 'error.php')));
@@ -168,9 +173,9 @@ class Errors extends \Exception
         $message = array_shift($argvs);
         $line = (int)array_pop($argvs);
         if ($count == 2) {
-            throw new \Qii\Exceptions\Errors($message, $line);
+            throw new Errors($message, $line);
         }
         $message = vsprintf($message, $argvs);
-        throw new \Qii\Exceptions\Errors($message, $line);
+        throw new Errors($message, $line);
     }
 }

+ 4 - 3
src/Functions/Funcs.php

@@ -37,17 +37,18 @@ function _log() {
 /**
  * 加载语言包
  * @param string $language 语言包
+ * @param string $dir 路径
  */
-function _language($language)
+function _language($language, $dir = '')
 {
-	\Qii\Language\Loader::getInstance()->load($language);
+	\Qii\Language\Loader::getInstance()->load($language, $dir);
 }
 
 /**
  * \Qii_Config_Register:: get or set
  * @param $key
  * @param null $val
- * @return Mix|void
+ * @return mixed|void|null
  */
 function _config($key, $val = null)
 {

+ 10 - 10
src/Language/Loader.php

@@ -5,17 +5,19 @@
  * @version 1.2
  *
  * Usage:
- *    Qii::Qii_Language_Loader('load', 'error', Qii_DIR); 加载系统目录中的语言
- *    Qii::Qii_Language_Loader('load', 'error'); 加载程序目录中的语言
+ *    \Qii\Language\Loader::getInstance()->load('error', Qii_DIR); 加载系统目录中的语言
+ *    \Qii\Language\Loader::getInstance()->load('error'); 加载程序目录中的语言
  * OR
- *    Qii::Qii_Language_Loader()->load('error', Qii_DIR); 加载系统目录中的语言
- *    Qii::Qii_Language_Loader()->load('error'); 加载程序目录中的语言
+ *    _language()->load('error', Qii_DIR); 加载系统目录中的语言
+ *    _language()->load('error'); 加载程序目录中的语言
  */
 namespace Qii\Language;
 
 use Qii\Autoloader\Factory;
+use Qii\Autoloader\Import;
 use \Qii\Config\Register;
 use \Qii\Config\Consts;
+use Qii\Exceptions\FileNotFound;
 
 class Loader
 {
@@ -25,9 +27,7 @@ class Loader
 	 */
 	private $loaded;
 
-	protected static $_instance;
-
-	public function __construct()
+    public function __construct()
 	{
 		return $this;
 	}
@@ -62,7 +62,7 @@ class Loader
 		}
 
 		//先获取语言配置信息
-		$language = \Qii\Autoloader\Import::includes($dir . 'i18n' . DS . 'language.php');
+		$language = Import::includes($dir . 'i18n' . DS . 'language.php');
 		//如果是cli模式就使用英文
 		if(IS_CLI) $language = "EN";
 		$fileName = $dir . 'i18n' . DS . $language . DS . $package . '.php';
@@ -71,7 +71,7 @@ class Loader
 		if (is_file($fileName)) {
 			return $this->merge($fileName);
 		}
-		throw new \Qii\Exceptions\FileNotFound($fileName, 404);
+		throw new FileNotFound($fileName, 404);
 	}
 
 	/**
@@ -82,7 +82,7 @@ class Loader
 	{
 		$data = Register::get(Consts::APP_LANGUAGE_CONFIG);
 		if (!is_file($fileName)) throw new Exceptions(\Qii::i(1405, $fileName));
-		$merge = (array) \Qii\Autoloader\Import::includes($fileName);
+		$merge = (array) Import::includes($fileName);
 		
 		if ($data) $merge = $data + $merge;
 		Register::set(Consts::APP_LANGUAGE_CONFIG, $merge);

+ 3 - 0
src/Qii.php

@@ -158,9 +158,12 @@ class Qii extends Application
 
     /**
      * 当调用不存在的静态方法的时候会试图执行对应的类和静态方法
+     * 斜线将会转换成下划线
      * 示例:
      * \Qii::Qii_Autoloader_Psr4('getInstance')
      *    此方法将调用:\Qii\Autoloader\Psr4::getInstance静态方法
+     *    Qii::InstanceApp("App");
+     *    此方法将调用:InstanceApp::App()静态方法
      */
     public static function __callStatic($className, $args)
     {