您好,登錄后才能下訂單哦!
小編給大家分享一下ThinkPHP中鉤子、行為擴展和插件機制的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
thinkphp屬于一種免費的開發(fā)框架,能夠用于開發(fā)前端網(wǎng)頁,最早thinkphp是為了簡化開發(fā)而產(chǎn)生的,thinkphp同時也是遵循Apache2協(xié)議,最初是從Struts演變過來,也把國外一些好的框架模式進行利用,使用面向?qū)ο蟮拈_發(fā)結(jié)構(gòu),兼容了很多標簽庫等模式,它能夠更方便和快捷的開發(fā)和部署應(yīng)用,當然不僅僅是企業(yè)級應(yīng)用,任何php應(yīng)用開發(fā)都可以從thinkphp的簡單、兼容和快速的特性中受益。
ThinkPHP的鉤子、行為擴展和插件機制
今天研究了一下ThinkPHP的鉤子,也算是框架的核心功能之一了,感覺很不錯。主要的兩個方向就是行為擴展和插件,這兩個都是業(yè)務(wù)邏輯比較獨立的,無需改動框架即可實現(xiàn)某個功能。
行為(Behavior),以下從tp3.2手冊摘了一段,還是比較好理解的。
你可以想象成在應(yīng)用執(zhí)行過程中的一個動作或者處理,在框架的執(zhí)行流程中,各個位置都可以有行為產(chǎn)生,例如路由檢測是一個行為,靜態(tài)緩存是一個行為,用戶權(quán)限檢測也是行為,大到業(yè)務(wù)邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網(wǎng)站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應(yīng)用,而在外圍通過擴展或者配置來改變或者增加一些功能。
你用來標記某個行為的名稱,我們就稱之為標簽(tag),tp框架里有內(nèi)置的系統(tǒng)標簽,如app_init、app_begin等,這些標簽就標記某些位置的行為(處理該行為)。
行為標簽的定義,一般是在配置文件中 Common/conf/tags.php
return array( 'mytest' => array('Portal\\Behavior\\testBehavior'), );
這里前面就是鉤子,而后面的array 是執(zhí)行為處理的位置,可以對應(yīng)多個,是按順序依次執(zhí)行。這是自動鉤子定義,還可以手動定義標簽
3.2.1版本之前
\Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior');
3.2.1版本之后
\Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior');
兩個方法都是可以的,這里需要注意一下,現(xiàn)在很多網(wǎng)上關(guān)于鉤子和行為的博客解說的都是3.2.1之前的,是按照插件的路徑去找執(zhí)行方法的。
不得不說一下,tp這里的處理比較坑。。
static public function exec($name, $tag,&$params=NULL) { if('Behavior' == substr($name,-8) ){ // 行為擴展必須用run入口方法 $class = $name; $tag = 'run'; }else{ $class = "plugins\\{$name}\\{$name}Plugin"; } if(class_exists($class)){ //ThinkCMF NOTE 插件或者行為存在時才執(zhí)行 $addon = new $class(); return $addon->$tag($params); } }
這里檢測了class不存在之后啥都沒有,debug下不記錄日志也沒trace,也是醉了。
上面的代碼寫的很清楚,$name是指tag的執(zhí)行路徑,如果name后綴為Behavior的就作為行為擴展執(zhí)行,如果不是,則作為plugns下的插件執(zhí)行。
行為的觸發(fā)
兩種方式,看代碼就知道其實就是tag調(diào)用Hook:listen
\Think\Hook::listen('標簽名'[,參數(shù)]); tag('標簽名'[,參數(shù)]);
行為擴展
行為擴展的定義,run在父類中是抽象方法所以必須重寫run方法,而行為擴展的入口就是run方法,有且只有一個run。
<?php namespace Home\Behaviors; class testBehavior extends \Think\Behavior{ //行為執(zhí)行入口 public function run(&$param){ } }
插件
插件的定義,在plugins目錄下,插件名作為文件夾test,下面有testPlugin.class.php,這樣的結(jié)構(gòu)才能被tp找到,這里只是一個簡單的主體Controller,test插件文件夾可以根據(jù)情況配置Controller、model、view等模塊,簡直不要太強大。
<?php namespace plugins\test; use Common\Lib\Plugin; class testPlugin extends Plugin { public function mytest($param){ echo 'this is plugin test-mytest'; } public function yourtest($param){ echo 'this is plugin test-yourtest'; //另一個插件鉤子的執(zhí)行入口 } }
和行為擴展不同,一個插件中可以包含多個方法,作為不同鉤子的的處理方法,這應(yīng)該是最大的區(qū)別。
以上是“ThinkPHP中鉤子、行為擴展和插件機制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。