今天研究了ThinkPHP的hook,这也是框架的核心功能之一,感觉很好。两个主要方向是行为扩展和插件,两者都相对独立于业务逻辑,可以在不改变框架的情况下实现一定的功能。Behavior,以下摘自tp3.2手册,比较通俗易懂。您可以将其想象为应用程序执行期间的一个动作或处理。在框架的执行过程中,可以在各个位置产生行为。比如路由检测是一种行为,静态缓存是一种行为,用户权限检测也是一种行为。从业务逻辑到小浏览器检测、多语言检测等等,都可以看做是一种行为,甚至说你要为第一次访问你网站的用户弹出Hello,world!所有这些都可以看作是一种行为。行为的存在允许你在不改变框架和应用程序的情况下,通过外围的扩展或配置来改变或增加一些功能。您用来标记特定行为的名称称为标签。tp框架中内置了系统标签,如app_init、app_begin等,这些标签标记了某些位置的行为(处理行为)。行为标签的定义一般在配置文件common/conf/tags.phpreturnarray('mytest'=>array('Portal\\Behavior\\testBehavior'),);这里是前面的钩子,后面的数组是处理执行的位置,可以对应多个,依次执行。这是一个自动hook定义,3.2.1版本之前也可以手动定义tag\Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior');3.2.1版本之后\Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior')::add('action_begin','Home\\Behaviors\\test1Behavior');两种方法都可以,这里需要注意一下,现在网上很多关于hooks和behaviors的博客都是在3.2.1之前解释的,是按照插件的路径找到执行方法的。不得不说tp这里的处理相当可怜。.staticpublicfunctionexec($name,$tag,&$params=NULL){if('Behavior'==substr($name,-8)){//行为扩展必须使用运行入口方法$class=$name;$tag='运行';}else{$class="插件\\{$name}\\{$name}插件";}if(class_exists($class)){//只有当ThinkCMFNOTE插件或行为存在时Execute$addon=new$class();返回$addon->$tag($params);}}这里检测到class不存在后,什么都没有,debug下也没有log和trace,也是醉了。上面的代码写的很清楚。$name是指标签的执行路径。如果名字后缀是Behavior,就会作为行为扩展执行。如果没有,它将作为plugns下的插件执行。有两种方法可以触发该行为。看代码可以知道标签调用了Hook:listen\Think\Hook::listen('标签名'[,parameter]);tag('标签名称'[,参数]);行为扩展行为扩展的定义,run是父类中的一个抽象方法,所以必须重写run方法,而行为扩展的入口是run方法,只有一个run。
