Zhu Jinhui 7 жил өмнө
parent
commit
9385d73967

+ 1 - 0
.gitignore

@@ -1 +1,2 @@
 .idea
+/private/tmp

+ 54 - 38
Qii/Application.php

@@ -1,6 +1,17 @@
 <?php
 namespace Qii;
 
+use \Qii\Base\Dispatcher;
+
+use \Qii\Autoloader\Factory;
+use \Qii\Autoloader\Import;
+use \Qii\Autoloader\Psr4;
+use \Qii\Autoloader\Instance;
+
+use \Qii\Config\Register;
+use \Qii\Config\Consts;
+use \Qii\Config\Setting;
+
 class Application 
 {
     /**
@@ -32,7 +43,7 @@ class Application
 
 	public function __construct()
 	{
-        $this->helper = \Qii\Autoloader\Psr4::getInstance()->loadClass('\Qii\Autoloader\Helper');
+        $this->helper = Psr4::getInstance()->loadClass('\Qii\Autoloader\Helper');
 	}
 
     /**
@@ -42,7 +53,12 @@ class Application
      */
 	public static function getInstance()
 	{
-	    return \Qii\Autoloader\Factory::getInstance('\Qii\Application');
+        $args = func_get_args();
+        if (count($args) > 0) {
+            $className = array_shift($args);
+            return Psr4::getInstance($className);
+        }
+	    return Factory::getInstance('\Qii\Application');
 	}
 
     /**
@@ -62,7 +78,7 @@ class Application
      */
     public function setCachePath($path)
     {
-        \Qii\Config\Register::set(\Qii\Config\Consts::APP_CACHE_PATH, $this->getCachePath($path));
+        Register::set(Consts::APP_CACHE_PATH, $this->getCachePath($path));
         return $this;
     }
 
@@ -73,7 +89,7 @@ class Application
      */
     public function setAppIniFile($iniFile)
     {
-        \Qii\Config\Register::set(\Qii\Config\Consts::APP_INI_FILE, $iniFile);
+        Register::set(Consts::APP_INI_FILE, $iniFile);
         return $this;
     }
 
@@ -89,13 +105,13 @@ class Application
         if (!is_dir($workspace)) {
             throw new \Qii\Exceptions\FolderDoesNotExist(\Qii::i(1045, $workspace), __LINE__);
         }
-        $workspace = \Qii\Autoloader\Psr4::getInstance()->realpath($workspace);
-        \Qii\Autoloader\Psr4::getInstance()->removeNamespace('workspace', self::$workspace);
+        $workspace = Psr4::getInstance()->realpath($workspace);
+        Psr4::getInstance()->removeNamespace('workspace', self::$workspace);
         //如果配置了使用namespace就走namespace
         self::$workspace = $workspace;
-        \Qii\Autoloader\Psr4::getInstance()->addNamespace('workspace', $workspace, true);
+        Psr4::getInstance()->addNamespace('workspace', $workspace, true);
         foreach (self::$paths AS $path) {
-            \Qii\Autoloader\Psr4::getInstance()->addNamespace($path, $workspace . '\\' . $path);
+            Psr4::getInstance()->addNamespace($path, $workspace . '\\' . $path);
         }
 
         return $this;
@@ -109,7 +125,7 @@ class Application
     {
         if (self::$workspace != '') return self::$workspace . DS . $path;
         $dir = '';
-        $workspace = \Qii\Autoloader\Psr4::getInstance()->getNamespace('workspace');
+        $workspace = sr4::getInstance()->getNamespace('workspace');
         foreach ($workspace AS $dir) {
             if (is_dir($dir)) $dir = $dir;
         }
@@ -137,7 +153,7 @@ class Application
      */
     public function getAppIniFile()
     {
-        return \Qii\Config\Register::get(\Qii\Config\Consts::APP_INI_FILE);
+        return Register::get(Consts::APP_INI_FILE);
         return $this;
     }
 
@@ -150,19 +166,19 @@ class Application
     public function setAppConfigure($ini, $env = '')
     {
         if ($env == '') $env = $this->getEnv();
-        $ini = \Qii\Autoloader\Psr4::getInstance()->getFileByPrefix($ini);
+        $ini = Psr4::getInstance()->getFileByPrefix($ini);
         $this->setAppIniFile($ini);
-        if (!\Qii\Config\Register::setAppConfigure(
+        if (!Register::setAppConfigure(
             $ini,
             $env
         )
         ) throw new \Qii\Exceptions\FileNotFound(\Qii::i(1405, $ini), __LINE__);
         //载入request方法
-        $this->request = \Qii\Autoloader\Psr4::getInstance()->loadClass('\Qii\Request\Http');
-        \Qii\Config\Setting::getInstance()->setDefaultTimeZone();
-        \Qii\Config\Setting::getInstance()->setDefaultControllerAction();
-        \Qii\Config\Setting::getInstance()->setDefaultNamespace();
-        \Qii\Config\Setting::getInstance()->setDefaultLanguage();
+        $this->request = Psr4::getInstance()->loadClass('\Qii\Request\Http');
+        Setting::getInstance()->setDefaultTimeZone();
+        Setting::getInstance()->setDefaultControllerAction();
+        Setting::getInstance()->setDefaultNamespace();
+        Setting::getInstance()->setDefaultLanguage();
         return $this;
     }
 
@@ -174,7 +190,7 @@ class Application
     public function mergeAppConfigure($iniFile, $array)
     {
         if (!is_array($array)) return;
-        \Qii\Config\Register::mergeAppConfigure($iniFile, $array);
+        Register::mergeAppConfigure($iniFile, $array);
         return $this;
     }
 
@@ -186,7 +202,7 @@ class Application
      */
     public function rewriteAppConfigure($iniFile, $key, $val)
     {
-        \Qii\Config\Register::rewriteConfig($iniFile, $key, $val);
+        Register::rewriteConfig($iniFile, $key, $val);
         return $this;
     }
     
@@ -198,7 +214,7 @@ class Application
      */
     public function setUseNamespace($prefix, $useNamespace = true)
     {
-        \Qii\Autoloader\Psr4::getInstance()->setUseNamespace($prefix, $useNamespace);
+        Psr4::getInstance()->setUseNamespace($prefix, $useNamespace);
         return $this;
     }
 
@@ -214,8 +230,8 @@ class Application
         if (!is_dir($baseDir)) {
             throw new \Qii\Exceptions\FolderDoesNotExist(\Qii::i(1009, $baseDir), __LINE__);
         }
-        $baseDir = \Qii\Autoloader\Psr4::getInstance()->realpath($baseDir);
-        \Qii\Autoloader\Psr4::getInstance()->addNamespace($prefix, $baseDir, $prepend);
+        $baseDir = Psr4::getInstance()->realpath($baseDir);
+        Psr4::getInstance()->addNamespace($prefix, $baseDir, $prepend);
         return $this;
     }
 
@@ -227,9 +243,9 @@ class Application
      */
     public function setBootstrap()
     {
-        \Qii\Autoloader\Psr4::getInstance()->loadFileByClass('Bootstrap');
+        Psr4::getInstance()->loadFileByClass('Bootstrap');
         if (!class_exists('Bootstrap', false)) throw new \Qii\Exceptions\ClassNotFound(\Qii::i(1405, 'Bootstrap'), __LINE__);;
-        $bootstrap = \Qii\Autoloader\Psr4::getInstance()->instance('Bootstrap');
+        $bootstrap = Psr4::getInstance()->instance('Bootstrap');
         if (!$bootstrap instanceof \Qii\Base\Bootstrap) {
             throw new \Qii\Exceptions\ClassInstanceof(Qii::i(1107, 'Bootstrap', 'Qii\Bootstrap'), __LINE__);;
         }
@@ -255,9 +271,9 @@ class Application
             throw new \Qii_Exceptions_ClassNotFound(Qii::i(1405, $logerCls), __LINE__);
         }*/
 
-        $this->logerWriter = \Qii\Autoloader\Instance::instance(
+        $this->logerWriter = Instance::instance(
             '\Qii\Loger\Instance',
-            \Qii\Autoloader\Instance::instance($logerCls)
+            Instance::instance($logerCls)
         );
         return $this;
     }
@@ -270,7 +286,7 @@ class Application
      */
     public function setDBIniFile($iniFile)
     {
-        \Qii\Config\Register::set(\Qii\Config\Consts::APP_DB, $iniFile);
+        Register::set(Consts::APP_DB, $iniFile);
     }
 
     /**
@@ -281,7 +297,7 @@ class Application
      */
     public function getDBIniFile()
     {
-        return \Qii\Config\Register::get(\Qii\Config\Consts::APP_DB);
+        return Register::get(Consts::APP_DB);
     }
 
     /**
@@ -293,8 +309,8 @@ class Application
     {
         if ($env == '') $env = $this->getEnv();
         $this->setDBIniFile($ini);
-        if (!\Qii\Config\Register::setAppConfigure(
-            \Qii\Autoloader\Psr4::getInstance()->getFileByPrefix($ini),
+        if (!Register::setAppConfigure(
+            Psr4::getInstance()->getFileByPrefix($ini),
             $env
         )
         ) {
@@ -311,15 +327,15 @@ class Application
      */
     public function setRouter($router)
     {
-        \Qii\Config\Register::set(
-            \Qii\Config\Consts::APP_SITE_ROUTER,
-            \Qii\Autoloader\Import::includes(
-                \Qii\Autoloader\Psr4::realpath(\Qii\Autoloader\Psr4::getInstance()->getFileByPrefix($router)
+        Register::set(
+            Consts::APP_SITE_ROUTER,
+            Import::includes(
+                Psr4::realpath(Psr4::getInstance()->getFileByPrefix($router)
                 )
             )
         );
         //载入rewrite规则后重写request
-        $rewrite = \Qii\Autoloader\Psr4::loadStatic(
+        $rewrite = Psr4::loadStatic(
             '\Qii\Route\Parse',
             'get',
             $this->request->controller,
@@ -351,7 +367,7 @@ class Application
 	public function run()
 	{
         $this->helper->load(self::$workspace);
-        $this->dispatcher = \Qii\Autoloader\Psr4::getInstance()->loadClass('\Qii\Base\Dispatcher');
+        $this->dispatcher = Psr4::getInstance()->loadClass('\Qii\Base\Dispatcher');
         if (!$this->dispatcher instanceof \Qii\Base\Dispatcher) {
             throw new \Exception('Dispatcher must instance of Qii\Base\Dispatcher', __LINE__);
         }
@@ -360,8 +376,8 @@ class Application
         if (count($hosts) > 0) {
             foreach ($hosts AS $host) {
                 if ($host['domain'] == $this->request->host) {
-                    \Qii\Config\Register::set(
-                        \Qii\Config\Consts::APP_DEFAULT_CONTROLLER_PREFIX,
+                    Register::set(
+                        Consts::APP_DEFAULT_CONTROLLER_PREFIX,
                         ($host['path'] ? $host['path'] : $host['domain'])
                     );
                     break;

+ 12 - 4
Qii/Autoloader/Factory.php

@@ -31,11 +31,19 @@ class Factory
         ){
             return Factory::$instance[$className];
         }
-        if(class_exists($className, false))
+
+        $args = func_get_args();
+        array_shift($args);
+        
+        if(!class_exists($className, false))
         {
-            return Factory::$instance[$className] = new $className;
+            $className = Psr4::getInstance()->getClassName($className);
+        }
+        $refClass = new \ReflectionClass($className);
+        $instance = $refClass->newInstanceArgs($args);
+        if ($refClass->hasMethod('_initialize')) {
+            call_user_func_array(array($instance, '_initialize'), $args);
         }
-        $className = Psr4::getInstance()->getClassName($className);
-        return Factory::$instance[$className] = new $className;
+        return Factory::$instance[$className] = $instance;
     }
 }

+ 3 - 3
Qii/Autoloader/Psr4.php

@@ -402,10 +402,10 @@ class Psr4
         if (!class_exists($className, false)) {
             throw new \Qii\Exceptions\CallUndefinedClass(\Qii::i('1105', $className), __LINE__);
         }
-        $loader = new \ReflectionClass($className);
-        self::$_loadedClass[$className] = $instance = $loader->newInstanceArgs($args);
+        $refClass = new \ReflectionClass($className);
+        self::$_loadedClass[$className] = $instance = $refClass->newInstanceArgs($args);
         //如果有_initialize方法就自动调用_initialize方法,并将参数传递给_initialize方法
-        if ($loader->hasMethod('_initialize')) {
+        if ($refClass->hasMethod('_initialize')) {
             call_user_func_array(array($instance, '_initialize'), $args);
         }
         return $instance;

+ 10 - 3
Qii/Config/Register.php

@@ -1,6 +1,4 @@
 <?php
-namespace Qii\Config;
-
 /**
  * 将键值保存到\Qii\Config\Register::$config中
  * 用于保存系统相关设置,保存项目相关的配置,请注意不出现key相互覆盖的情况,可以考虑加前缀
@@ -17,6 +15,15 @@ namespace Qii\Config;
  *
  *
  */
+namespace Qii\Config;
+
+use \Qii\Application;
+
+use \Qii\Config\Register;
+use \Qii\Config\Consts;
+
+use \Qii\Exceptions\Variable;
+
 class Register
 {
 	const VERSION = '1.3';
@@ -74,7 +81,7 @@ class Register
 	 */
 	public static function get($key, $default = null)
 	{
-		if (!$key) throw new Qii_Exceptions_Variable(\Qii::i(1003), __LINE__);
+		if (!$key) throw new \Qii\Exceptions\Variable(\Qii::i(1003), __LINE__);
 		//优先调用存在的get方法
 		$method = 'get' . $key;
 		if (method_exists('\Qii\Config\Register', $method)) return \Qii\Config\Register::$method();

+ 8 - 4
Qii/Language/Loader.php

@@ -1,5 +1,4 @@
 <?php
-namespace Qii\Language;
 /**
  * 加载语言包
  * @Author Jinhui Zhu
@@ -12,6 +11,11 @@ namespace Qii\Language;
  *    Qii::Qii_Language_Loader()->load('error', Qii_DIR); 加载系统目录中的语言
  *    Qii::Qii_Language_Loader()->load('error'); 加载程序目录中的语言
  */
+namespace Qii\Language;
+
+use \Qii\Config\Register;
+use \Qii\Config\Consts;
+
 class Loader
 {
 	const VERSION = 1.3;
@@ -75,12 +79,12 @@ class Loader
 	 */
 	protected function merge($fileName)
 	{
-		$data = \Qii\Config\Register::get(\Qii\Config\Consts::APP_LANGUAGE_CONFIG);
+		$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);
 		
 		if ($data) $merge = $data + $merge;
-		\Qii\Config\Register::set(\Qii\Config\Consts::APP_LANGUAGE_CONFIG, $merge);
+		Register::set(Consts::APP_LANGUAGE_CONFIG, $merge);
 	}
 
 	/**
@@ -90,7 +94,7 @@ class Loader
 	 */
 	public function get($code)
 	{
-		$data = \Qii\Config\Register::get(\Qii\Config\Consts::APP_LANGUAGE_CONFIG, array());
+		$data = Register::get(Consts::APP_LANGUAGE_CONFIG, array());
 		if (isset($data) && isset($data[$code])) {
 			return $data[$code];
 		}

+ 5 - 3
Qii/Loger/Instance.php

@@ -1,8 +1,10 @@
 <?php
-namespace Qii\Loger;
 /**
  * 注册一个写日志的插件,由项目本身去实现是否写日志,当框架在抛出异常的时候会触发写日志的操作
  */
+namespace Qii\Loger;
+
+use \Qii\Loger\Writer;
 class Instance
 {
 	const VERSION = '1.2';
@@ -11,7 +13,7 @@ class Instance
 	 */
 	private $logerHooker;
 
-	public function __construct(\Qii\Loger\Writer $hooker)
+	public function __construct(Writer $hooker)
 	{
 		$this->setHooker($hooker);
 	}
@@ -19,7 +21,7 @@ class Instance
 	/**
 	 * 设置写日志的类
 	 */
-	public function setHooker(\Qii\Loger\Writer $hooker)
+	public function setHooker(Writer $hooker)
 	{
 		$this->logerHooker = $hooker;
 	}

+ 1 - 0
Qii/Loger/Writer.php

@@ -1,5 +1,6 @@
 <?php
 namespace Qii\Loger;
+
 interface Writer
 {
 	public function setFileName($fileName);

+ 1 - 1
Qii/Plugin/Intf.php

@@ -1,6 +1,6 @@
-
 <?php
 namespace Qii\Plugin;
+
 interface Intf
 {
     public function __construct(\Qii\Plugin\Plugin &$pluginManger);

+ 13 - 9
Qii/Qii.php

@@ -29,9 +29,13 @@ require Qii_DIR . DS . 'Autoloader' . DS . 'Import.php';
                                 )
 );
 
-use \Qii\Autoloader;
 use \Qii\Application;
 
+use \Qii\Autoloader\Factory;
+use \Qii\Autoloader\Psr4;
+
+use \Qii\Config\Register;
+
 class Qii extends Application
 {
     public function __construct()
@@ -40,7 +44,7 @@ class Qii extends Application
     }
     public static function getInstance()
     {
-	    return \Qii\Autoloader\Factory::getInstance('\Qii');
+	    return Factory::getInstance('\Qii');
     }
     /**
      * 设置private 属性
@@ -50,7 +54,7 @@ class Qii extends Application
      */
     public static function setPrivate($name, $value)
     {
-        \Qii\Autoloader\Psr4::getInstance()->loadClass('\Qii\Config\Arrays')->setPrivate($name, $value);
+        Psr4::getInstance()->loadClass('\Qii\Config\Arrays')->setPrivate($name, $value);
     }
 
     /**
@@ -62,7 +66,7 @@ class Qii extends Application
      */
     public static function getPrivate($name, $key = '')
     {
-        $private = \Qii\Autoloader\Psr4::getInstance()->loadClass('\Qii\Config\Arrays')->getPrivate($name);
+        $private = Psr4::getInstance()->loadClass('\Qii\Config\Arrays')->getPrivate($name);
         if (preg_match('/^\s*$/', $key)) {
             return $private;
         }
@@ -72,7 +76,7 @@ class Qii extends Application
 	public static function i()
     {
         return call_user_func_array(array(
-            \Qii\Autoloader\Psr4::getInstance()->loadClass('\Qii\Language\Loader'), 'i'),
+            Psr4::getInstance()->loadClass('\Qii\Language\Loader'), 'i'),
             func_get_args()
         );
     }
@@ -106,7 +110,7 @@ class Qii extends Application
      */
     public static function appConfigure($key = null)
     {
-        return \Qii\Config\Register::getAppConfigure(\Qii::getInstance()->getAppIniFile(), $key);
+        return Register::getAppConfigure(\Qii::getInstance()->getAppIniFile(), $key);
     }
     
     /**
@@ -117,7 +121,7 @@ class Qii extends Application
      */
     public function __call($className, $args)
     {
-        return call_user_func_array(array(\Qii\Autoloader\Psr4::getInstance(), 'loadClass'), $args);
+        return call_user_func_array(array(Psr4::getInstance(), 'loadClass'), $args);
     }
     /**
      * 当调用不存在的静态方法的时候会试图执行对应的类和静态方法
@@ -128,7 +132,7 @@ class Qii extends Application
     public static function __callStatic($className, $args)
     {
         $method = array_shift($args);
-        $className = \Qii\Autoloader\Psr4::getInstance()->getClassName($className);
+        $className = Psr4::getInstance()->getClassName($className);
         return call_user_func_array($className . '::' . $method, $args);
     }
 }
@@ -142,7 +146,7 @@ if (!function_exists('catch_fatal_error')) {
         if (isset($error['type']) && $error['type'] == E_ERROR) {
             // Fatal Error Occurs
             $message = array();
-            $message[] = 'Error file : ' . ltrim($error['file'], \Qii\Autoloader\Psr4::realpath($_SERVER['DOCUMENT_ROOT']));
+            $message[] = 'Error file : ' . ltrim($error['file'], Psr4::realpath($_SERVER['DOCUMENT_ROOT']));
             $message[] = 'Error line : ' . $error['line'] . ' on ' . \Qii\Exceptions\Errors::getLineMessage($error['file'], $error['line']);
             $message[] = 'Error description : ' . $error['message'];
             \Qii\Exceptions\Error::showError($message);

+ 11 - 1
Qii/Response/Cli.php

@@ -10,6 +10,16 @@ class Cli extends \Qii\Base\Response
      */
     public function __toString()
     {
-        return $this->_body;
+        $this->stdout($this->_body);
+    }
+    /**
+     * 在windows cmd 情况下的中文输出乱码问题
+     * @param string $string
+     * @return bool|int
+     */
+    public function stdout($string)
+    {
+        $string = iconv('utf-8', 'gbk', $string);
+        return fwrite(\STDOUT, $string);
     }
 }

+ 9 - 3
Qii/Route/Parse.php

@@ -1,5 +1,11 @@
 <?php
 namespace Qii\Route;
+
+use \Qii\Autoloader\Import;
+
+use \Qii\Config\Register;
+use \Qii\Config\Consts;
+
 /**
  * 路由规则类
  *
@@ -30,10 +36,10 @@ class Parse
             return array('controller' => $controller, 'action' => $action);
         }
         //如果第一列的是*号则所有的controller都执行对应的x:
-        $router =\Qii\Config\Register::getAppConfigure(\Qii\Config\Consts::APP_SITE_ROUTER);
-        $rewriteRule = \Qii\Config\Register::getAppConfigure(\Qii\Config\Register::get(\Qii\Config\Consts::APP_INI_FILE), 'rewriteRule');
+        $router = Register::getAppConfigure(Consts::APP_SITE_ROUTER);
+        $rewriteRule = Register::getAppConfigure(Register::get(Consts::APP_INI_FILE), 'rewriteRule');
         if (!$rewriteRule) $rewriteRule = 'Normal';
-        \Qii\Autoloader\Import::requires(Qii_DIR . DS . 'Route' . DS . 'Parse' .DS. $rewriteRule . '.php');
+        Import::requires(Qii_DIR . DS . 'Route' . DS . 'Parse' .DS. $rewriteRule . '.php');
         $className = '\Qii\Route\Parse\\' . $rewriteRule;
         if (!class_exists($className, false)) {
             throw new \Qii\Exceptions\ClassNotFound(\Qii::i(1103, $className), __LINE__);

+ 272 - 2
README.md

@@ -1,3 +1,273 @@
-# Qii
+# 新版Qii
 
-新版Qii
+使用方法:
+
+1、创建项目
+   通过命令行进入当前目录,并执行:php -q _cli.php create=yes workspace=../project cache=tmp useDB=1
+	Command line usage:
+	>php -q _cli.php create=yes workspace=../project cache=tmp useDB=1
+	* create: is auto create default:yes;
+	* workspace: workspace
+	* cache : cache dir
+	* useDB : use db or not 
+	程序将自动创建工作目录,并生成首页及配置相关文件。设置好Web网站目录,开启.htaccess即可直接访问。
+	相关的配置文件见 configure/app.ini及configure/db.ini文件
+
+2、框架的使用
+	1) 命令行运行程序
+		仅支持GET方法
+		1. normal模式
+		php -q index.php control=index/action=home/id=100
+		php -q index.php control=plugins/action=index/page=2
+
+		2. middle模式
+		php -q index.php control/index/action/home/id/100
+		php -q index.php control/plugins/action/index/page/2
+
+		3. short模式
+		php -q index.php index/home/100
+		php -q index.php plugins/page/2.html
+	2) 自动加载类
+		new Controller\User(); === require("Controller<?=DS?>User.php"); new Controller\User();
+		new Model\User(); === require("Model<?=DS?>User.php"); new Model\User();
+		new Model\Test\User(); === require("Model<?=DS?>Test<?=DS?>User.php"); new Model\Test\User();
+
+	3) Qii 基本功能:
+		Qii::Instance(className, param1, param2, param3[,...]); === ($class = new className(param1, param2, param3[,...]));
+		Qii::load(className)->method(); === $class->method();
+		Qii::import(fileName); 如果指定的文件无法找到则会在get_include_path()和站点配置文件的[path]的目录中去搜索,直到搜索到一个则停止。
+		Qii::includes(fileName); == include(fileName);
+		Qii::setPrivate($key, $value);保存到私有变量 $_global[$key]中, $value可以为数组,如果是数组的话会将数组合并到已经存在$key的数组中去。
+		Qii::getPrivate($key, $index);获取$_global[$key][$index]的值
+		Qii::setError($condition, $code, $argvs); 检查$condition是否成立,成立就没有错,返回false,否则有错,返回true并将错误信息,详细代码错误$code详情见<?php echo Qii::getPrivate('qii_sys_language');?>。
+	4) 多域名支持:
+		开启多域名支持,不同域名可以访问不同目录中的controller,在app.ini中的common下添加以下内容,注意:hosts中的内容会覆盖网站中对应的配置
+        hosts[0.domain] = test.xxx.wang
+        hosts[0.ext] = test
+
+        hosts[1.domain] = admin.xxx.wang
+        hosts[1.ext] = admin
+	5) Module用法示例:
+		第一步,创建一个user的model
+		class user_model extends Model
+		{
+			public function __construct()
+			{
+				parent::__construct();
+			}
+			public function userInfo($uid)
+			{
+				return $this->getRow("SELECT * FROM user WHERE uid = '{$uid}'");
+			}
+		}
+		第二步,使用user_model
+		class user_controler extends Qii_Controller_Abstract
+		{
+			public function __construct()
+			{
+					$this->Qii('Model');
+					$userClass = new user_module();
+					$userInfo = $userClass->userInfo(10);
+
+					或
+					$this->Qii("user_module")->userInfo(10);
+					或
+					$this->Qii("user_module");
+					$this->user_module->userInfo(10);
+			}
+		}
+	6) ORM的使用示例:
+		第一步,创建表对应的ORM模型
+		/**
+		 * User ORM 模型
+		 * @author Zhu Jinhui 2015-02-13 11:26
+		 *
+		 */
+		class User extends Tables
+		{
+			public function getTableName()//返回User对应的数据表
+			{
+				return 'istudy_user';
+			}
+			public function getRelationMap()//返回alias对应的字段名
+			{
+				return array('id' => 'uid', 'email' => 'email', 'nick' => 'nickname');
+			}
+			public function getValidateSaveFields()//保存数据需要验证的字段
+			{
+				return array('email', 'password');
+			}
+			public function getValidateRules()//验证规则
+			{
+				return array('email' => array('email' => true), 'password' => array('password' => true, 'length' => 32));
+			}
+			public function getInvalidMessage()//验证不通过返回的消息内容
+			{
+				return array();
+			}
+		}
+		第二步,创建User Model:
+		class user_model extends Model
+		{
+		    public function __construct()
+		    {
+		        parent::__construct();
+		    }
+		    /**
+		     * 注册
+		     * @param String $email
+		     * @param String $password
+		     * @return Array
+		     */
+		    public function register($email, $password)
+		    {
+		    	$data = array();
+		    	if(!$email || !$password)
+		    	{
+		    	    $data['code'] = 1;
+		    	    $data['error'] = array('result' => '参数不正确');
+		    		return $data;
+		    	}
+		    	$user = new User();
+		    	$user->email = $email;
+		    	$user->password = md5($password);
+		    	$user->active_code = substr(md5(uniqid(rand(), TRUE)), -6);
+		    	$user->add_time = time();
+		    	$user->update_time = time();
+		    	
+		    	$user->setPrivateKey('email');
+		    	$isExists = $user->isExits();
+		    	
+		    	if($isExists)
+		    	{
+		    	    $data['code'] = 10001;
+		    	    $data['data'] = $isExists;
+		    	}
+		    	else
+		    	{
+		    	   $data['code'] = 0;
+		    	   $data['uid'] = $user->execSave();
+		    	   if($user->getTablesError())
+		    	   {
+		    	       $data['error'] = $user->getTablesError();
+		    	   }
+		    	}
+		    	return $data;
+		    }
+		    
+		    public function login($email, $password)
+		    {
+		    	$data = array();
+		    	if(!$email || !$password)
+		    	{
+		    		return $data;
+		    	}
+		    	$user = new User();
+		    	$user->email = $email;
+		    	//$user->password = md5($password);
+		    	$userInfo = $user->isExits();
+		    	if($userInfo['uid'])
+		    	{
+		    	    if($userInfo['password'] != md5($password))
+		    	    {
+		    	        $data['code'] = 1;
+		    	        $data['msg'] = '密码不正确';
+		    	    }
+		    	    else
+		    	    {
+		    	       $data['code'] = 0;
+		    	       $cookie['uid'] = $userInfo['uid'];
+		    	       $cookie['email'] = $userInfo['email'];
+					   $data['cookie'] = $cookie;
+		    	    } 
+		    	}
+		    	return $data;
+		    }
+		}
+		第三步,使用user_model:
+		
+		class index_controller extends Qii_Controller_Abstract
+		{
+			public function __construct()
+			{
+				$user = new user_model();
+				$status = $user->login('email@test.com', '119328118');
+				if($status['code'] === 0) echo '登录成功';
+			}
+		}
+	7) View的支持
+		view支持smarty及php
+		class index_controller extends Qii_Controller_Abstract
+		{
+			public function __construct()
+			{
+				$this->enableView();//默认是app.ini中的view[engine],你可以在此处选择是用include或者require,只要将参数默认传给enableView即可
+				$this->view->display('tpl'); //$this->view即为使用的模板引擎
+			}
+		}
+	8) Controller的使用
+	class test_controller extends Qii_Controller_Abstract
+	{
+		//为了避免Controller逻辑过于复杂,可以将Action拆到单独的文件
+		//当在调用dummy方法的时候会自动执行actions/dummy_action.php中的execute方法
+		public $actions = array(
+				"dummy" => "actions/dummy_action.php",
+		);
+		public function __construct()
+		{
+			parent::__construct();
+		}
+	}
+	9) Cache支持
+	Controller中使用Cache
+	class cache_controller extends Controller
+	{
+		public function __construct()
+		{
+			parent::__construct();
+		}
+		public function cacheTest()
+		{
+			$cache_id = 'cache_test';
+			//文件缓存
+			$this->setCache('file', array('path' => 'tmp'));
+			//Memcache缓存
+			$this->setCache('memcache', array('servers' => array( array('host'=>'127.0.0.1','port'=>11211) ) ,'life_time'=>600));
+			//xcache
+			$this->setCache('xcache', array('life_time'=>600));
+			//缓存内容
+			$this->cache($cache_id, 'cache内容');
+			//redis缓存
+			$this->setCache('redis', array('servers' => array('127.0.0.1.6379')));
+			$this->cache($cache_id, array('cache' => 'cache 内容'));
+			//获取缓存内容
+			$this->getCache($cache_id);
+			//移除缓存
+			$this->cache->remove($cache_id);
+		}
+	}
+	
+	Model中使用
+	class cache_model extends Model
+	{
+		public function __construct()
+		{
+			parent::__construct();
+		}
+		public function cacheTest()
+		{
+			$cache_id = 'cache_test';
+			//文件缓存
+			$this->setCache('file', array('path' => 'tmp'));
+			//Memcache缓存
+			$this->setCache('memcache', array('servers' => array( array('host'=>'127.0.0.1','port'=>11211) ) ,'life_time'=>600));
+			//xcache
+			$this->setCache('xcache', array('life_time'=>600));
+			//缓存内容
+			$this->cache($cache_id, 'cache内容');
+			//获取缓存内容
+			$this->getCache($cache_id);
+			//移除缓存
+			$this->cache->remove($cache_id);
+		}
+	}

+ 1 - 0
private/Controller/index.php

@@ -27,6 +27,7 @@ class index extends \Qii\Base\Controller
 
     public function displayAction()
     {
+        \Qii::getInstance('ww');
         //可以从这里设置加载模板的路径
         $this->view->setTemplateDir(__DIR__ . "/view/");
         $this->view->display('index.tpl');