Giter VIP home page Giter VIP logo

actioninvokermix's Introduction

ActionInvokerMix

												ActionInvoker调度框架简介及使用入门
												
							 [使用Notepad++/UtralEditor/EditPlus/ZendStudio等专业编辑器查看效果更佳]

一、框架结构:

1、概览图
		|index.php
		|path__.php
		|
		|
		|core	|action	|Index.action.php
		|		|		|Test.action.php
		|		|
		|		|config	|const.php
		|		|		|define.php
		|		|		|shell.php
		|		|
		|		|filter	|Test.filter.php
		|		|       
		|		|entity	|Demo.entity.php
		|		|
		|		|lib	|base			|__include__.php
		|		|		|				|path__.php
		|		|		|				|env__.php
		|		|		|				|filter__.php
		|		|		|				|action__.php

项目名 | | | |url__.php | | | |init__.php | | | | | | | | |ext |其它自添加的库... | | | | | |tpl |default |Action模板存放点 | | | | | | | | |other |普通模板存放点 | | | | | |setting|各种格式的 | |配置文件, | |文件内容格式自定, | |解析配置文件过程 | |也需要自己编写 | | |res |img |css |js |其它资源文件

2、说明

	0)概念、名词解释:
		a、本框架的核心是“URL参数————Action调度”。
		b、入口:又称入口文件,是http请求后服务器首先调用的脚本,一般认为 /index.php就是入口。
			一般入口文件所在目录要配备一个path__.php文件,关于path__.php的作用及编写方法,见第一、2、 8) 条。
		c、Action方法:在Xxxx.action.php中定义的类方法,用static限定,调用形式:XxxxAction::shell();。
			模块:就是XxxxAction
			操作:就是XxxxAction中的类方法。
			默认模块:输入链接[ http://server.com/ItemName ]后被访问的模块。
			默认指令:输入链接[ http://server.com/ItemName ]后被访问的Action方法的名称。关于自定义默认指令,见 env__.php的DEFAULT_URL_SHELL
		d、指令(亦称URL SHELL、URL指令、shell)来源于链接[ http://server.com/ItemName/?xxx=param ]的param部分。
		e、param部分称为“URL全参数”,本项目要求的合法param的格式是:
					[指令] | [ 后续参数(集) = { [参数1|参数2|...|参数n-1] [ | id串={id1-id2-...-idn}] } ]
					例如:假设存在指令“dirdir”,不存其它指令“abc”
						dirdir|abcde|1-2-3-4-5		合法
						dirdir|abcde				合法
						dirdir|1-2-3-4-5			合法
						dirdir|1-2--4-5					非法
						dirdir						合法
						1-2-3-4						合法
						dirdir|							非法
						|dirdir							非法
						|dirdir|						非法
						dirdir|abcde|					非法
						|								非法
						||								非法
						|||								非法
						||||.....						非法
						abc								非法
						abc|abcd 						非法
						abc|1-2-3-4-5					非法
						abc|							非法
						|abc							非法
						|abc|							非法
						更多情况不一一列举,请依次类推。
		
				从以上的列举可以看出,指令必定存在于“URL全参数”的第一个单词。
		f、系统如果从URL解析出指令[URL SHELL],那么就会继续寻找有没有对应的Action方法。
		g、如果一个指令能够成功调用某个Action方法,则存在与这个指令名称相同的Action方法。
				如:index指令对应index()方法。至于index()方法属于哪个Action,那就要看action__.php文件中怎么配置了。
		h、URL参数状态:其实就是对链接中param部分的种类划分。值:0 ~ 5。
			 * 0、空(长度0)
			 * 1、只有指令(长度1)
			 * 2、只有id串(长度1)
			 * 3、全满含id尾:有指令有作为id串的尾部
			 * 4、全满无id尾:有指令没有作为id串的尾部。也包括如“dirdir|fdsfdsfd|real|1-0-1”,最后一个参数可以认为已经不是id串了。
			 * 5、非法:
			 * 		长度为1时,非指令非id串;
			 * 		长度>1时,第一项非指令;
			 * 		长度等于1时id串去除第一个后还含有“零”项;
			 * 		“xxx|xxx|xxx|xxx”URL含有空串参数,即是否含有“||”或“空串|”或“|空串”;
		i、URL参数信息:通过UrlUtil::analyseUrlParam() @ url__.php获得。
			其数据格式:
			 * 		array (
			 * 			'status'=>	0~5 ,	//URL参数状态
			 * 			'shell'		=>	'URL命令/null',
			 * 			'params'	=>	array (
			 * 								被“|”分隔的参数集合
			 * 							),
			 * 			'ids'	=>	array(被“-”分割的id数组,不以“零”项开头,且不包含“零”项)
			 * 		);
	
	1)/core/action/ 目录用于放置业务相关的[模块——>操作]文件
		其中的IndexAction是默认的模块,内部的方法index()对应的指令是index.
		Action方法的传入参数:可以注意到,预配置的Action方法中,有名为$urlInfo的参数。
				该参数就是从URL中解析得到的参数信息,其参数状态有:0,1,3,4.最常见的参数状态是4。
				如何提取传入参数:从1开始,依次是 $urlInfo['params'][1]、$urlInfo['params'][2]、$urlInfo['params'][3]、...
				提取到的参数对应于:URL指令|param1|param2|param3|...
		将Action方法注册为URL指令:通过注册指令,就可以通过链接方式调用Action方法。
				本框架预注册的指令有:test,index,demo,对应于TestAction::test(),IndexAction::index(),IndexAction::demo()。
				注册方法:见ActionUtil::numOfShellArgs() @ aciton__.php及其注释部分。
		Action方法的调用代码:
			a、在某个模块中调用内部方法,可使用$this->方法名()。但是这种普通的调用方法将无法执行所绑定的过滤器。
				【关于过滤器,见第 一、2、5)条】
				如果要在调用方法前执行过滤器,则可使用:parent::__call($method, $vars)。
				其中,$method是方法名,$vars是传入的参数表构成的数组。
				例如:parent::__call('test', array($urlInfo));
			b、在模块外部调用模块方法:
				一般的代码是:$a = new XxxxAction(); $a -> 方法名();
				本框架推荐的代码是:ActionUtil::action('Action名称,如Index')->方法名();
				如果调用代码所处的位置也是在模块中,则调用代码还可写成:$this->action('Action名')->方法();或self::action('Action名')->方法();
		重新定义默认的模块及指令,见 DEFAULT_URL_SHELL @ env__.php 和 ActionUtil::numOfShellArgs() @ action__.php。
		另外的TestAction是示例模块,其方法test()已在ActionUtil::numOfShellArgs()中注册。
		
	2)/core/lib/ 目录存放基础库base和其他库
		基础库/core/lib/base/如下:
				环境配置文件					env__.php,
				过滤器支持文件				filter__.php,
				模块配置文件					action__.php,
				URL解析支持文件				url__.php,
				路径纠正支持文件				path__.php,
				系统初始化文件				init__.php,
				一次性包含常用库的文件		__include__.php
			a、env__.php配置常量和一些系统的惯例,如时区设定
			b、filter__.php提供过滤器支持。关于过滤器的说明和使用方法,见 【/core/filter/ 目录的说明】。
			c、action__.php配置所有Action的方法所对应的参数,以及配置如何调度Actions。详见源码注释。
			d、url__.php配置URL静态化、URL重写。从URL中分析参数信息等等。详见源码注释。
			e、init__.php初始化系统:
				=>先解析URL参数	=>尝试常规调度(Action) =>常规调度失败则尝试根据URL参数寻找模板文件并输出 =>匹配不到模板文件,则按404处理。
			f、__include__.php用于包含整个项目常用的文件。
				任何文件只要在其同目录下含有文件__path.php,并且已包含之,
				那么在包含这个文件之后,本文件所包含的文件就能被包含了。
		扩展库/core/lib/ext/:
			默认情况下,开发者应该把自行导入的库放置到此处。
			如果想把自己的库放到别处,则需要到env__.php配置USER_LIB_DIRS常量,具体配置方法见其注释。
	
	3)/core/setting/ 目录:存放各种格式的配置文件,其文件内容格式任意,但是需要自己编写解析配置文件的方法。
		作者已经有了一些类型配置文件的解析方法了,但是尚未整合到该框架中,请期待后续版本。
	
	4)/core/tpl/ 目录:存放模板输出文件的目录。
		    模板文件定义:用于输出到客户端的文件
		    模板的分类:按照用途,可以分为Action模板、普通模板。具体用途详见后续说明。
		    模板输出的底层实现方式:使用php的require_once语句。
		    模板参数支持:
		    	由XxxxAction的基类ActionUtil::getTplArgs() 提供带索引数组形式的参数,以供模板文件内脚本使用。
		    	由setTplArgs($tpl_args)方法设置参数,如果没什么参数可提供的,则可不写参数。
		a、Action模板:
			Ⅰ、特点:Action方法附属的模板文件,与方法同名,并由该Action方法独享。
			Ⅱ、命名规则:文件名等于方法名,后缀限定为.php。
			Ⅲ、存放位置:默认为/core/tpl/default/。如需自定义,见ACTION_TEMPLATE_DIR @ /core/lib/base/env__.php
					具体操作:先在core/tpl/default/新建名为Action名称的文件夹,
							   再在这个文件夹中新建与Action方法同名的模板文件,后缀名限定为.php。
							 如:IndexAction::index()的模板文件路径时:/core/tpl/default/Index/index.php
			Ⅳ、如何访问?不能通过链接直接访问,只能通过ActionUtil类方法tpl($tpl_args)实现间接访问。
				XxxxAction可以通过继承ActionUtil来得到tpl()方法的使用权。
			Ⅴ、参数支持:由基类ActionUtil::$tpl_args 提供带索引数组形式的参数,以供模板文件内脚本使用。
			Ⅵ、输出结果:如果找不到相应的模板文件,则不会输出任何内容,但tpl()方法会返回false作为标志。
						成功则返回true。开发者可以根据tpl()的返回值来判断是否输出成功。
			Ⅶ、用途:给业务方法配备专用的输出模板。
		b、普通模板:
			Ⅰ、特点:与Action模板不同,不从属于Action方法,可以在任何地方被调用。
			Ⅱ、命名规则:1、不含“-”;2、必须以.php为后缀名。
			Ⅲ、存放位置:默认为/core/tpl/other/。如需自定义,见 OTHER_TEMPLATE_DIR @ /core/lib/base/env__.php
				  可以要再细分目录存放模板文件,如果想通过链接访问到再深一层的文件,则需要用“-”代替“/”。
				 如:http://server.com/ItemName/?xxx=a-b-c 将默认访问到core/tpl/a/b/c.php。
			Ⅳ、如何访问?
				链接访问法:http://server.com/ItemName/?xxx=模板文件参数。
				代码调用法:require_once OTHER_TEMPLATE_DIR.'模板文件'。
			Ⅴ、标准的模板文件参数格式:a-b-c-...-z。
			Ⅵ、使用(“\”、“/”)混淆模板文件参数以保护路径。
 				对于【'r_^-fds \  \--/gh'】之类的文件名参数,本系统可以将之解析为【r_^/fds/gh】
 				(原参数中,有“-”和“--”,但是结果就有两条“/”。至于原参数中的“\\”和“/”,将被清除)。
 				继续对【'r_^-fds \  \--/gh'】进行URL编码,可以得到【r_%5E-fds%20%5C%20%20%5C--%2Fgh】。
			Ⅶ、设置模板参数:
				如果使用【代码调用法】:则可以在调用之前,先执行XxxxAction::setTplArgs($tpl_args)以向模板文件提供参数。
				如果使用【链接访问法】:则无法设置参数。链接访问法通常用于不需要参数的页面。
			Ⅷ、输出结果:如果找不到模板,则按404处理。
			Ⅸ、用途:如果多个业务需要共享一个页面,则可以使用普通模板。
	
	5)/core/filter/ 目录:存放XxxxFilter.class.php。这个目录涉及到过滤器。
		a、过滤器:执行某过程之前需要执行的操作。
		b、内置过滤器:框架内置的 【模块单过滤器】,其实就是一个接口Filter,内设方法doFilter(),用于在进入Action模块前的过滤。
		c、单过滤器:如果某个过程仅需要一个过滤器,那么这个过滤器就构成了单过滤器。
		d、过滤器链:如果某个过程需要多个过滤器,那么这些过滤器就构成了过滤器链。
		e、过滤器分类:
			在本框架中,过滤器按过滤类型分为两种:Action模块过滤器、Action操作[方法]过滤器;
			再按过滤层次还可分为:单过滤器、过滤器链。
		f、过滤器群组:存储多种过程各自需要的单过滤器或过滤器链的单位。
			一般地,将属于同一个XxxxAction的所有模块过滤器和方法过滤器  归并到  同一个过滤器群组中。
			自然而然,这个存储单位将使用XxxxFilter.class.php存储。
			只要定义了XxxxFilter或XxxxAction实现了Filter接口,那么XxxxAction将自动绑定过滤器。
		g、使用过滤器详解:
			 * 1、如果仅需要————单个Action模块过滤器,就不需要定义高级过滤器 XxxxFilter,仅需实现Filter接口。
			 * 	格式如:
			 * 			class XxxxAction implements Filter{
			 *	 			public function doFilter(){
			 * 					//实现系统内置的模块单过滤器
			 * 				}
			 * 			}
			 * 2、如果需要在进入Action模块之前设置多个过滤器,那么这里就可以用到XxxxFilter了。
			 * 	过滤器群组XxxxFilter的定义格式:
			 * 		class XxxxFilter {
			 * 			public function doFilter_1(){
			 * 				//模块过滤器1
			 * 			}
			 * 			public function doFilter_2(){
			 * 				//模块过滤器2
			 * 			}
			 * 				... ...
			 * 		}
			 * 	  执行过滤器的顺序将是:doFilter_1(), doFilter_2(), ...
			 * 	 如果XxxxAction还实现了Filter接口的doFilter()方法,则会先执行doFilter(),再执行doFilter_1(), doFilter_2(), ...
			 *   建议:如果是定义多个模块过滤器,就不要使用框架内置的【模块单过滤器Filter】,以确保代码的可读性。
			 * 3、如果Action模块中的操作[方法]也需要过滤器,则可以在XxxxFilter()定义专门过滤Action操作的方法,方法名与Action方法同名
			 * 	格式如:
			 * 		class XxxxFilter {
			 * 			public function Aaaa(){
			 * 				//XxxxAction::Aaaa()方法对应的过滤器
			 * 			}
			 * 		}
			 *     如果XxxxAction::Aaaa()方法需要多个过滤器,则可以这样定义:
			 * 		class XxxxFilter {
			 * 			public function Aaaa_1(){
			 * 				//XxxxAction::Aaaa()方法对应的过滤器
			 * 			}
			 * 			public function Aaaa_2(){
			 * 				//XxxxAction::Aaaa()方法对应的过滤器
			 * 			}
			 * 			public function Aaaa_3(){
			 * 				//XxxxAction::Aaaa()方法对应的过滤器
			 * 			}
			 * 				... ...
			 * 		}
			 * 		执行过滤器的顺序将是:Aaaa_1(), Aaaa_2(), Aaaa_3(), ...
			 * 		如果Aaaa()过滤方法也存在,则会先执行Aaaa(),在执行Aaaa_1(), Aaaa_2(), Aaaa_3(), ...
			 * 	      建议:如果是定义多个方法过滤器,就不要再使用与Action方法同名的过滤方法,以确保代码的可读性。
			 */
		h、重新定制过滤器目录:见 FILTER_DIR @ /core/lib/base/env__.php
		
	6)/res/ 目录:存放js,css,img等资源文件。
		常规使用方法:可以自行定义常量以方便导入。如定义js目录为JS_DIR,在页面中使用<?=APPROOT.JS_DIR.'具体JS' ?>完成调用。
				对于一些频繁调用的文件,如jquery.js,则可进一步定义常量JQUERY_PATH为APPROOT.'res/js/jquery.js'。
	
	7)/index.php	一般会作为项目的入口。
		脚本固定执行流程如下:
			添加路径纠错支持
			包含框架
			完毕。
		代码:
			----------------------------------------------------------------------------------------------------------------------
			<?php
			/**
			 * 项目默认入口
			 */
			require_once 'path__.php';	//路径纠错支持
			require_once APPROOT.'core/lib/base/__include__.php';	//一次性包含常用库和所有Action
			/*
			 * 以上两行代码已经完成了框架的初始化,后面也不用添加什么代码了,写了也没有用,执行不到的。
			 * 要写业务处理,就定义XxxxAction;
			 * 要给业务加上过滤器,就直接让XxxxAction实现Filter接口或定义过滤器群组XxxxFilter
			 * 要显示页面,使用模板输出。
			 */
			?>
			----------------------------------------------------------------------------------------------------------------------
		如果需要定制其它入口文件,则新入口文件内的代码也和/index.php的一样,
		并要根据入口文件的目录层次,为其配备一个合适的path__.php文件,详见第一、2、8)条。
		
	8) path__.php  路径纠正支持文件
		a、作用:该文件中的APPROOT常量可以解决文件多重包含时产生的路径错乱问题。
		b、编写方法:
				<?php
				defined('APPROOT') or define('APPROOT','路径值');
				?>
		c、什么是路径值(APPROOT)?
			路径值指的是 项目根目录相对于path__.php的目录,如(''、'../'、'../../'等等)。
			如:
				/path__.php位于项目根目录,应配置的值为  './';
				/core/path__.php位于第一层目录,所以配置的值为 '../';
				/core/lib/path__.php位于第二层目录,所以配置的值为 '../../';
				/core/lib/base/path__.php位于第三层目录,所以配置的值为 '../../../';
		d、何时需要用到path__.php?
			凡是需要包含其它文件的脚本,都需要包含path__.php。【require_once 'path__.php';】
			那么,入口文件就要用到path__.php。
			
	9) APPROOT 常量
		a、其含义见第 8) 条。
		b、使用APPROOT包含文件的格式【require_once APPROOT.'路径串';】。
			要求路径串从项目根目录为起点,如:
			require_once APPROOT.'core/lib/base/__include__.php';
			
	10)	/core/entity/ 目录:存放实体类文件。例如Demo.entity.php
	
	11) /core/config/ 目录:存放开发者自定义常量、URL自定义指令等等。

二、使用入门

1、将ActionInvoker文件夹提取到站点根目录,文件夹名称改为自己的项目名称。

2、在/core/lib/base/env__.php配置自己系统中需要的常量和惯例(如时区设定)。
	需要重点配置的常量是:ENABLE_URL_REWRITE,其它自便。详见注释。
3、查看默认的Action及操作。
	本项目已经预先在env__.php中定义了常量DEFAULT_URL_SHELL等于“Index-index”,对应IndexAction::index()。
	且在action__.php中的ActionUtil::numOfShellArgs()预配置的Index->index()参数个数为0.
	直接在浏览器测试类似以下链接:
		a、http://server.com/ItemName
		b、http://server.com/ItemName/?xxx=index
	就可以看到欢迎页。
	
4、如果要添加自己的功能,则可以自行添加模块XxxxAction.class.php到/core/action/中,
	例如 添加文件模块FileAction,并在其中添加[显示目录内容]的方法listfile()。具体步骤如下:
		a、新建/core/action/File.action.php,代码参考Index.action.php
		b、在/core/lib/base/action__.php的ActionUtil::numOfShellArgs()中注册listfile()方法,并指定所需参数个数。
			这里的参数个数 不  是定义function时的参数表的参数个数,而是URL参数信息中count($urlInfo['params'])的值。
			【注:$urlInfo = UrlUtil::analyseUrlParam($_REQUEST);	//见core/lib/base/url__.php】
		c、测试链接:
			如果参数个数为0————http://server.com/ItemName/?xxx=listfile
			如果参数个数大于0————http://server.com/ItemName/?xxx=listfile|后续参数(集)
			
5、如果需要将自己添加的功能设置为默认功能,只需要配置 DEFAULT_URL_SHELL  @  /core/lib/action__.php
	默认值的格式:Action名称-方法名,如:define('DEFAULT_URL_SHELL','File-listfile');
	注意:所配置的默认功能必须存在。
	
6、如果需要导入其它库,只需要把库文件放置到/core/lib/ext/ 目录中,可以在其中再设定子目录存放。
	放置完毕后,系统将会自动包含其内所有层次目录的*.php文件。
	如果需要把自定义库文件放置到别处,则需要配置USER_LIB_DIR  @  /core/lib/base/env__.php

7、简单输出页面:
	a、使用Action模板:
		将需要输出的Action页面放到/core/tpl/default/目录(如需改变目录,见ACTION_TEMPLATE_DIR @ /core/lib/base/env__.php)
		本框架已预定义了IndexAction::index()对应的模板,位于/core/tpl/default/Index/index.php。
		并在IndexAction::index()中使用了模板输出方法:self::tpl();
		预配置的模板将输出的内容是 本框架的欢迎页。
	b、使用普通模板:
		将需要输出的自由页面放到/core/tpl/other/目录(如需改变目录,见OTHER_TEMPLATE_DIR @ /core/lib/base/env__.php)
		本框架已预定义了普通模板/core/tpl/other/othertest.php。
		并在TestAction::test()方法中给出了测试代码。也可以通过链接来测试。
		链接访问方法:http://server.com/ItemName/?xxx=模板文件参数。(详见 一、2、(4) 条)			

8、简单使用过滤器:
	本框架通过让TestAction模块实现Filter接口,从而绑定了内置的单模块过滤器Filter::doFilter()。
	通过定义过滤器群组TestFilter,从而使TestAction模块绑定了TestFilter::doFilter_*()过滤器链,
		也使TestAction::test()方法绑定过滤器TestFilter::test(),TestFilter_test_*()过滤器链。
	测试预置过滤器:执行IndexAction::demo	()方法即可。
		测试链接:http://server.com/ItemName/?xxx=demo

9、强烈要求:不要用Windows自带的记事本编辑本框架的源代码,否则会由于UTF-8与GBK编码的混杂问题,导致IE9加载页面出错。

三、版本变更日志

2013-7-29
	【
	初版:支持URL分析和Action调度
	】

2013-7-30
	【
	加入自动包含库文件和Action的支持,嵌入使用向导到首页
	】

2013-7-31
	【
	加入模板输出支持、
	
	非法参数和无效模板的404处理,
	
	准备加入过滤器支持(实现Filter接口以拦截进入Action模块的数据流)
	】

2013-8-4
	【
	1、扩充模板输出能力,可以分为Action模板和普通模板两类;
	
	2、对无法访问到的脚本拦截,需要服务器支持URL重写;
	
	3、加入过滤器支持,支持单过滤器和过滤器链,
	
	   可以为模块专门定制一个过滤器群组
	】
	
2013-12-5 
	添加config目录配置支持,至此,开发者将可在别处定义常量,而不用直接编辑env__.php。
	但对于框架级的常量,还是要回到env__.php中修改。

2013-12-7
	添加entity目录配置支持,至此,开发者将可以定义自己的实体类
	简化了Action和Filter文件的名称。
	
2013-12-8
	将URL指令和对应参数个数的配置从/core/lib/base/action__.php转移到/core/config/目录下的任意文件中,
	只要在这个位置的任意一个文件中定义类“AiUrlShell”即可,具体参考/core/config/urlshell.php

2013-12-9 
	1、修正了XxxxFilter中定义的doFilter_x()  模块级过滤方法无法被执行到的BUG。
	2、发现了url参数的ids项的值不能超过2147483647(ids项被强制转换成了int类型)
		例如:
		http://localhost:8080/php/ActionInvoker/?xxx=demo|123121561651
		所传的第一个后续参数为:“123121561651”
		那么得到的url参数信息为:
		Array ( [status] => 3 [shell] => demo [params] => Array ( [0] => demo [1] => 123121561651 ) [ids] => Array ( [0] => 2147483647 ) ) 
		此情况不予处理,使用时请多加注意。
	3、发现了 /core/tpl/othertest/ 目录内的普通模板访问链接方式除了可用“-”隔开以外,还可用“/”或“\”
		例如:
		http://localhost:8080/ActionInvoker/?xxx=a-othertest
		可改为
		http://localhost:8080/ActionInvoker/?xxx=a/othertest
		或
		http://localhost:8080/ActionInvoker/?xxx=a\othertest
		对此情况,不予处理。并支持此情况继续存在,希望使用者可以灵活运用该特性。
	4、发现部分编写的页面没有以下声明时,在IE9模式下将无法正常加载。
		<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
		<html xmlns="http://www.w3.org/1999/xhtml">
	        因此建议,每个页面要有这些声明,以提高兼容性。

2013-12-10 
	1、在“page”指令对应的页面中新增URL指令及参数测试功能,可以通过输入的信息实时测试模块。
	2、添加了全局过滤器支持。
		详见:
		GLOBAL_FILTER_NAME @ /core/lib/base/env__.php
		eval(GLOBAL_FILTER_NAME.'::doFilter($urlInfo);'); @ /core/lib/base/init__.php
		class GLOBALFILTER @ /core/filter/GLOBALFILTER.filter.php 

2013-12-12 
	1、添加新的模块指令测试页面,其指令为“shelltest”,以方便开发人员直观地测试自己的模块功能。
		使用方法:
			根据页面中的提示,左边输入URL指令,右边输入参数(多个参数用“|”分开),下方的方框即显示访问结果。
			如果URL指令所需参数个数为零,则要清空右边的输入域。
		注意:shelltest指令对应的测试页将在后续的某个版本中取代“page”指令所指页面。

2013-12-15至17
	 1、在/core/lib/exe/ 目录添加 [ mysql扩展 ] ,支持增、删、改实体。
	 2、修改/core/lib/base/init__.php,就此新增了全局过滤器链的支持。
	 	全局过滤链的使用方法类似于XxxxAction的过滤器。
	 	详见:
	 		GLOBAL_FILTER_NAME @ /core/lib/base/env__.php
	 		FILTER_DIR @ /core/lib/base/env__.php
	 		%FILTER_DIR% / %GLOBAL_FILTER_NAME% . filter.php

2013-12-18
	1、在  [ mysql扩展 ] 中,添加了AiMySQLCondition.class.php,支持单个SQL条件的对象化,以配合MySQL查询。

2013-12-19
	1、在  [ mysql扩展 ] 中,添加了AiMySQLCombination、AiMySQLOrderBy类,使SQL条件子句和排序子句规范化。
	2、在  [ mysql扩展 ]的实体查询中,支持条件查询、结果集游标范围指定、条件组合方式有限指定。
		已实现:查询条件——》结果集——》严格的类型转换——》正确对象的集合

2013-12-20
	1、为 [ MySQL扩展 ] 提供第二种种查询支持:任意SQL查询。
	
2013-12-21
	关于过滤器有效性的说明
		Action方法的过滤器的有效性由以下因素决定
			Action方法的访问修饰符(public、protected),
			对应的过滤器,
			访问Action的方式
		现有某Action方法:urlshell()。作以下规定:
		---------------------------------------------
		if ( 以URL方式访问(http://yourserver:port/project/?xxx=urlshell) ){
			if ( 有定义对应的XxxFilter且有过滤器urlshell() ){
				if ( Action方法无访问修饰符 )
					【过滤器有效】;
				else if( Action方法以public修饰 )
					【过滤器有效】;
				else if( Action方法以protected修饰 )
					【过滤器有效】;
				else if( Action方法以private修饰 )
					【过滤器 无 效】且Action方法无法执行;
			}
			else if ( 没有对应的过滤器方法urlshell()或urlshell_*() ){
				if ( Action方法以public修饰  || Action方法以protected修饰  || Action方法无访问修饰符 )
					【无过滤功能】;
				else if( Action方法以private修饰 )
					【无过滤功能】且Action方法无法执行;
			}
		}
		else if( 以代码调用方式访问(ActionUtil::action('Xxxx')->urlshell();) ){
			if ( 有定义对应的XxxFilter且有过滤器urlshell() ){
				if ( Action方法无访问修饰符 )
					【过滤器 无 效】;
				else if( Action方法以public修饰 )
					【过滤器 无 效】;
				else if( Action方法以protected修饰 )
					【过滤器有效】;
				else if( Action方法以private修饰 )
					【过滤器 无 效】且Action方法无法执行;
			}
			else if ( 没有对应的过滤器方法urlshell()或urlshell_*() ){
				if ( Action方法以public修饰  || Action方法以protected修饰  || Action方法无访问修饰符 )
					【无过滤功能】;
				else if( Action方法以private修饰 )
					【无过滤功能】且Action方法无法执行;
			}
		}
		----------------------------------------------
		综上所述,凡是设置了过滤器的Action方法,
			如果设置为public或空,则仅在URL访问时会执行过滤器;
			如果设置为protected,则在URL访问或代码调用时都会执行过滤器;
			如果设置为private,则无论怎么访问,过滤器都是无效的。
	强烈建议:
		凡是需要过滤器的Action方法,都修饰为protected。
		对于protected,顾名思义,就是受过滤器保护的意思。

2013-12-22
	在/core/config/目录添加了附加过滤规则(AFR),文件名为filtermap.php。
	在该文件中,可以配置需要或不需要配置全局过滤器的模块或指令。
	原理详见FilterUtil::globalFilter() @ /core/lib/base/filter__.php 和 init__.php
	
2014-1-7
	1、[mysql扩展]开始支持数据表前缀,例如fm_xxx表与xxx对象对应。
	2、关于配置文件中一个值的说明
		值:AiAdditionalFilterMapRule::$elsePrior @ /core/config/filtermap.php
		说明:该值设定后,还有另外一种效果,即:
		* 	当为true时,如果某指令(如index)既需要又不需要全局过滤器,则视为需要全局过滤器
		* 	当为false时,如果某指令(如index)既需要又不需要全局过滤器,则视为 不 需要全局过滤器

2014-1-29
	1、添加[FTP扩展],目录ftp
		支持
			单文件全新上传、
			单文件断点上传、
			单文件全新下载、
			单文件断点下载、
			单文件改名(目录层次不改变为前提)、
			单目录改名(目录层次不改变为前提)、
			列出指定远程目录内的所有文件和目录明细。
		见AiFtp.class.php。
		支持FTP状态码反馈,见AiFtpStatus.class.php
	2、添加[FTP扩展]对应的测试Block,位于ftp_test()@HelpAction
	
	
	
	
	
	
	中间空了很多,需要补充回来,请查看历史各个版本的change.txt
	
	
	
	
	
2014-4-13
	1、修正[mysql扩展]中mysql.php第109~110行,添加了以下语句:
			if(false===$value) $value='false';//如果字段为布尔假,则用无引号的false
			if(true===$value) $value='true';//如果字段为布尔真,则用无引号的true
			
		修正了插入bool数值到SQL语句导致语法不正常的BUG(布尔值处留空,即两个逗号之间为空)。
	


2014-05-17

	0、版本号暂时更改为OpenAI[1.0.0],内部版本号依旧为内部版本号ActionInvoker[1.9.8]。

	1、ActionInvoker将进入面向2.0的过渡阶段,目录结构为一个公共、多个成员。
	
	2、[AiFtp][AiMySQL]转移至公共目录public。
	
	3、新增[AiSQL]外挂SQL语句支持。
	
	4、新增core/lib/util/TableUtil.class.php,其内部分成员方法更安全可靠,将可替代AiMySQL的部分成员方法。
	
	5、新增core/lib/util/OrekiUtil.class.php,内有少量常用方法。
	
	6、新增AI前端配套插件AiForm.js,详见public/res/js/Ai/AiForm.js。
		使用方法详见:public/core/tpl/other/ai/widget.php。

	7、指定public目录的首页与说明文档关联,指定成员目录的首页与指令测试页面shelltest关联。
	
	8、public目录的启动脚本位于其目录外层,而成员目录的启动脚本位于其目录内第一层。
		项目根目录中index.php所指定的PUBLIC_DIR_NAME,将指定作为公用的目录;
		其它成员目录中的index.php所指定的PUBLIC_DIR_NAME,将指定其从属的公共目录。


2014-05-18

	1、公共目录的默认名称由public更改为leader,如需自定义,见根目录index.php配置。
	
	2、成员目录的默认名称由memberX更改为hypotaxis,如需自定义,见hypotaxis/index.php配置。
	
	3、精简成员目录中base库的文件,将以leader目录的base库为准。

actioninvokermix's People

Contributors

ltre avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.