日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php扩展实现hook,ThinkPHP3.2 扩展(钩子,HOOK)

發布時間:2025/3/19 php 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php扩展实现hook,ThinkPHP3.2 扩展(钩子,HOOK) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Thinkphp 執行流程

/index.php ->require './ThinkPHP/ThinkPHP.php';

/ThinkPHP/ThinkPHP.php ->require CORE_PATH.'Think'.EXT; Think\Think::start();

/ThinkPHP/Library/Think/Think.class.php –>App::run();

/ThinkPHP/Library/Think/App.class.php

App::run()方法

// 應用初始化標簽

Hook::listen('app_init');

App::init();

// 應用開始標簽

Hook::listen('app_begin');

// Session初始化

if(!IS_CLI){

session(C('SESSION_OPTIONS'));

}

// 記錄應用初始化時間

G('initTime');

App::exec();

// 應用結束標簽

Hook::listen('app_end');

return ;

Hook::listen('')就是用來執行鉤子的,我們可以在app_init這個安插的位置用來獲取應用中安裝的插件

/**

* 監聽標簽的插件

* @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;

}

其中關鍵是:self::exec($name, $tag,$params)。

exec的代碼:

/**

* 執行某個插件

* @param string $name 插件名稱

* @param string $tag 方法名(標簽名)

* @param Mixed $params 傳入的參數

* @return void

*/

static public function exec($name, $tag,&$params=NULL) {

if(false === strpos($name,'\\')) {

// 插件(多個入口)

$class = "Addons\\{$name}\\{$name}Addon";

}else{

// 行為擴展(只有一個run入口方法)

$class = $name.'Behavior';

$tag = 'run';

}

$addon = new $class();

return $addon->$tag($params);

}

最后是?new $class();return $addon->$tag($params);?又轉到了具體鉤子的代碼方法。其實就是我們原本的調用class的方法,只不過經過封裝了。

鉤子有什么用?

以OneThink 的{:hook('AdminIndex')}為例

在系統初始化到?Hook::listen('app_init');?時,?把app_init的標簽位擴展了,在tags.php的配置文件中有這么個東西:用于初始化插件(或者說是獲取系統中安裝的插件)

return array(

'app_init'=>array('Common\Behavior\InitHook')

);

InitHook:

// 行為擴展的執行入口必須是run

public function run(&$content){

if(isset($_GET['m']) && $_GET['m'] === 'Install') return;

$data = S('hooks');

if(!$data){

$hooks = M('Hooks')->getField('name,addons');

foreach ($hooks as $key => $value) {

if($value){

$map['status'] = 1;

$names = explode(',',$value);

$map['name'] = array('IN',$names);

$data = M('Addons')->where($map)->getField('id,name');

if($data){

$addons = array_intersect($names, $data);

Hook::add($key,$addons);

}

}

}

S('hooks',Hook::get());

}else{

Hook::import($data,false);

}

}

onethink_hooks 表結構

DROP TABLE IF EXISTS `onethink_hooks`;

CREATE TABLE `onethink_hooks` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',

`name` varchar(40) NOT NULL DEFAULT '' COMMENT '鉤子名稱',

`description` text NULL COMMENT '描述',

`type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '類型',

`update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新時間',

`addons` varchar(255) NOT NULL DEFAULT '' COMMENT '鉤子掛載的插件 '',''分割',

`status` tinyint(1) unsigned NOT NULL DEFAULT '1',

PRIMARY KEY (`id`),

UNIQUE KEY `name` (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- -----------------------------

-- Records of `onethink_hooks`

-- -----------------------------

INSERT INTO `onethink_hooks` VALUES ('13', 'AdminIndex', '首頁小格子個性化顯示', '1', '1382596073', 'SiteStat,SystemInfo,DevTeam', '1');

當在程序執行到{:hook('AdminIndex')}時—>調用的是Hook::listen('AdminIndex');

AdminIndex這個掛載點包含了三個插件:分別是:SiteStat, SystemInfo,DevTeam。

用一個循環來分別按順序執行.

總結:鉤子其實就是起到一個掛載點的作用,這個鉤子掛在哪里,就可以在哪里執行,內容或功能就是掛載插件或類庫的具體實現。這樣實現的代碼就有很大的靈活性,掛載點不變,掛的東西變量,功能也就相應的變化

總結

以上是生活随笔為你收集整理的php扩展实现hook,ThinkPHP3.2 扩展(钩子,HOOK)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。