本文實例講述了thinkPHP3.2.2框架行為擴展。分享給大家供大家參考,具體如下:
首先介紹一下行為擴展類,本人愚鈍,還是借用tp手冊上的來說:
行為(Behavior)是一個比較抽象的概念,你可以想象成在應用執行過程中的一個動作或者處理,在框架的執行流程中,各個位置都可以有行為產生,例如路由檢測是一個行為,靜態緩存是一個行為,用戶權限檢測也是行為,大到業務邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應用,而在外圍通過擴展或者配置來改變或者增加一些功能。
而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應用執行前,有些行為都是在模板輸出之后,我們把這些行為發生作用的位置稱之為標簽(位),當應用程序運行到這個標簽的時候,就會被攔截下來,統一執行相關的行為,類似于AOP編程中的“切面”的概念,給某一個切面綁定相關行為就成了一種類AOP編程的思想。
那下面就入正題,講解一下行為(Behavior)的實例
讓行為工作有兩種方式:
1.通過在conf目錄下的tags.php文件 配置行為 通過/Think/Hook::listen(name);
觸發行為
2.通過/Think/Hook::add(name,class_namespace)
注冊一個行為,然后觸發(注冊函數必須在觸發函數之前)
在我們講解實例之前,很有必要先講講行為是怎么觸發的。
行為觸發靠的是/Think/Hook::listen(name)
方法,那方法里面到底做了什么,我們先看看源碼:
/** * 監聽標簽的插件 * @param string $tag 標簽名稱 * @param mixed $params 傳入參數 * @return void *//** * add by yangligao 2014/8/25 * listen 個人覺得方法名稱取得不怎么好理解,看程序中就知道這個方法實際上就是看$tags中有沒有參數中的tag * 如果有,就觸發之; * 如果沒有,你懂的,過之(至少程序中是沒有做操作)。 */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; //thinkphp原始的樣式 return $result;//筆者^_^自己添加的}
這個方法里面記錄行為的一些運行狀態的值,函數最后一點筆者做了一點修改,只是讓這個方法有了一份返回值(而非返回空)
最重要的地方就是
$result = self::exec($name, $tag,$params);
這個地方就開始執行所謂的行為了,先看看exec
方法的源碼
/** * 執行某個插件 * @param string $name 插件名稱 * @param string $tag 方法名(標簽名) * @param Mixed $params 傳入的參數 * @return void */ /** * add by yangligao 2014/8/25 * exec 執行文件 */ static public function exec($name, $tag,&$params=NULL) { if('Behavior' == substr($name,-8) ){ // 行為擴展必須用run入口方法 $tag = 'run'; }// file_put_contents('D:/1.txt',$name,FILE_APPEND ); $addon = new $name(); return $addon->$tag($params); }
這個方法所做的就是先判斷行為配置中的設定的類名中是否有Behavior這個字符串,如果有就執行一個叫run的方法
準備工作差不多了。下面動手試試實例
方法一:通過在conf目錄下的tags.php文件 配置行為 通過/Think/Hook::listen(name);
觸發行為
我們先在Home/Conf下面準備tags.php配置文件
<?phpreturn array( 'app_app' => array('Home/Behavior/DemoShowHelloWorldBehavior'),);
根據這個配置文件,我們還得在Home/Behavior下面準備DemoShowHelloWorldBehavior
的類文件
<?phpnamespace Home/Behavior;use Think/Controller;/** * 這個文件的類可以繼承Controller類 這樣就可以使用assign方法 * 這個方法框架里面:對你的返回值不理睬,只是用作判斷插件有沒有出錯 * 出于某個目的,筆者對Hook::listen方法作了小修改 讓他可以返回值,或許會有點用 */class DemoShowHelloWorldBehavior extends Controller{ public function run(){ $return_string = '(Home/Behavior)<font>DemoShowHelloWoldBehavior</font> is Running....^_^!<hr>'; $this->assign('behavior_assign','This is assigned by <font>DemoShowHelloWoldBehavior</font>'); return $return_string; }}
這個類文件,我們是繼承的控制器,里面做了兩件事:
1.返回一個字符串
2.使用Controller方法的assign方法給模板賦值
然后我們來觸發這個行為,你只需要在控制器總寫上一下代碼以及在對應模板中輸出對應變量
$behaviorReturn = /Think/Hook::listen('app_app');
<div>{$behavior_assign}</div>
這樣頁面就會輸出行為類中assign的變量值了,行為類的返回值這里沒有打印,你有興趣可以打印看看哦
方法二:.通過/Think/Hook::add(name,class_namespace)
注冊一個行為,然后觸發(注冊函數必須在觸發函數之前)
這個與方法一唯一的區別就是他不用定義tags.php文件,取而代之的是一個php語句(如下):
/Think/Hook::add('app_app', 'Home//Behavior//DemoShowHelloWorldBehavior');
其他的操作都相同。
新聞熱點
疑難解答
圖片精選