|
|
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006~2013 http://topthink.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: liu21st <liu21st@gmail.com>
- // +----------------------------------------------------------------------
- namespace Think;
- /**
- * ThinkPHP系统钩子实现
- */
- class Hook {
-
- static private $tags = array();
-
- /**
- * 动态添加插件到某个标签
- * @param string $tag 标签名称
- * @param mixed $name 插件名称
- * @return void
- */
- static public function add($tag,$name) {
- if(!isset(self::$tags[$tag])){
- self::$tags[$tag] = array();
- }
- if(is_array($name)){
- self::$tags[$tag] = array_merge(self::$tags[$tag],$name);
- }else{
- self::$tags[$tag][] = $name;
- }
- }
-
- /**
- * 批量导入插件
- * @param array $data 插件信息
- * @param boolean $recursive 是否递归合并
- * @return void
- */
- static public function import($data,$recursive=true) {
- if(!$recursive){ // 覆盖导入
- self::$tags = array_merge(self::$tags,$data);
- }else{ // 合并导入
- foreach ($data as $tag=>$val){
- if(!isset(self::$tags[$tag]))
- self::$tags[$tag] = array();
- if(!empty($val['_overlay'])){
- // 可以针对某个标签指定覆盖模式
- unset($val['_overlay']);
- self::$tags[$tag] = $val;
- }else{
- // 合并模式
- self::$tags[$tag] = array_merge(self::$tags[$tag],$val);
- }
- }
- }
- }
-
- /**
- * 获取插件信息
- * @param string $tag 插件位置 留空获取全部
- * @return array
- */
- static public function get($tag='') {
- if(empty($tag)){
- // 获取全部的插件信息
- return self::$tags;
- }else{
- return self::$tags[$tag];
- }
- }
-
- /**
- * 监听标签的插件
- * @param string $tag 标签名称
- * @param mixed $params 传入参数
- * @return void
- */
- static public function listen($tag, &$params=NULL) {
- if(isset(self::$tags[$tag])) {
- if(APP_DEBUG) {
- G($tag.'Start');
- trace('[ '.$tag.' ] --START--','','INFO');
- }
- foreach (self::$tags[$tag] as $name) {
- APP_DEBUG && G($name.'_start');
- $result = self::exec($name, $tag,$params);
- if(APP_DEBUG){
- G($name.'_end');
- trace('Run '.$name.' [ RunTime:'.G($name.'_start',$name.'_end',6).'s ]','','INFO');
- }
- if(false === $result) {
- // 如果返回false 则中断插件执行
- return ;
- }
- }
- if(APP_DEBUG) { // 记录行为的执行日志
- trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO');
- }
- }
- return;
- }
-
- /**
- * 执行某个插件
- * @param string $name 插件名称
- * @param string $tag 方法名(标签名)
- * @param Mixed $params 传入的参数
- * @return void
- */
- static public function exec($name, $tag,&$params=NULL) {
- if('Behavior' == substr($name,-8) ){
- // 行为扩展必须用run入口方法
- $tag = 'run';
- }
- $addon = new $name();
- return $addon->$tag($params);
- }
- }
|