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