您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“thinkPHP3.2.2框架行為擴(kuò)展的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“thinkPHP3.2.2框架行為擴(kuò)展的示例分析”這篇文章吧。
具體如下:
首先介紹一下行為擴(kuò)展類,本人愚鈍,還是借用tp手冊(cè)上的來(lái)說(shuō):
行為(Behavior)是一個(gè)比較抽象的概念,你可以想象成在應(yīng)用執(zhí)行過(guò)程中的一個(gè)動(dòng)作或者處理,在框架的執(zhí)行流程中,各個(gè)位置都可以有行為產(chǎn)生,例如路由檢測(cè)是一個(gè)行為,靜態(tài)緩存是一個(gè)行為,用戶權(quán)限檢測(cè)也是行為,大到業(yè)務(wù)邏輯,小到瀏覽器檢測(cè)、多語(yǔ)言檢測(cè)等等都可以當(dāng)做是一個(gè)行為,甚至說(shuō)你希望給你的網(wǎng)站用戶的第一次訪問(wèn)彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無(wú)需改動(dòng)框架和應(yīng)用,而在外圍通過(guò)擴(kuò)展或者配置來(lái)改變或者增加一些功能。
而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應(yīng)用執(zhí)行前,有些行為都是在模板輸出之后,我們把這些行為發(fā)生作用的位置稱之為標(biāo)簽(位),當(dāng)應(yīng)用程序運(yùn)行到這個(gè)標(biāo)簽的時(shí)候,就會(huì)被攔截下來(lái),統(tǒng)一執(zhí)行相關(guān)的行為,類似于AOP編程中的“切面”的概念,給某一個(gè)切面綁定相關(guān)行為就成了一種類AOP編程的思想。
那下面就入正題,講解一下行為(Behavior)的實(shí)例
讓行為工作有兩種方式:
1.通過(guò)在conf目錄下的tags.php文件 配置行為 通過(guò)\Think\Hook::listen(name);
觸發(fā)行為
2.通過(guò)\Think\Hook::add(name,class_namespace)
注冊(cè)一個(gè)行為,然后觸發(fā)(注冊(cè)函數(shù)必須在觸發(fā)函數(shù)之前)
在我們講解實(shí)例之前,很有必要先講講行為是怎么觸發(fā)的。
行為觸發(fā)靠的是\Think\Hook::listen(name)
方法,那方法里面到底做了什么,我們先看看源碼:
/** * 監(jiān)聽(tīng)標(biāo)簽的插件 * @param string $tag 標(biāo)簽名稱 * @param mixed $params 傳入?yún)?shù) * @return void */ /** * add by yangligao 2014/8/25 * listen 個(gè)人覺(jué)得方法名稱取得不怎么好理解,看程序中就知道這個(gè)方法實(shí)際上就是看$tags中有沒(méi)有參數(shù)中的tag * 如果有,就觸發(fā)之; * 如果沒(méi)有,你懂的,過(guò)之(至少程序中是沒(méi)有做操作)。 */ 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 則中斷插件執(zhí)行 return ; } } if(APP_DEBUG) { // 記錄行為的執(zhí)行日志 trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO'); } } // return; //thinkphp原始的樣式 return $result;//筆者^(guò)_^自己添加的 }
這個(gè)方法里面記錄行為的一些運(yùn)行狀態(tài)的值,函數(shù)最后一點(diǎn)筆者做了一點(diǎn)修改,只是讓這個(gè)方法有了一份返回值(而非返回空)
最重要的地方就是
$result = self::exec($name, $tag,$params);
這個(gè)地方就開(kāi)始執(zhí)行所謂的行為了,先看看exec
方法的源碼
/** * 執(zhí)行某個(gè)插件 * @param string $name 插件名稱 * @param string $tag 方法名(標(biāo)簽名) * @param Mixed $params 傳入的參數(shù) * @return void */ /** * add by yangligao 2014/8/25 * exec 執(zhí)行文件 */ static public function exec($name, $tag,&$params=NULL) { if('Behavior' == substr($name,-8) ){ // 行為擴(kuò)展必須用run入口方法 $tag = 'run'; } // file_put_contents('D:/1.txt',$name,FILE_APPEND ); $addon = new $name(); return $addon->$tag($params); }
這個(gè)方法所做的就是先判斷行為配置中的設(shè)定的類名中是否有Behavior這個(gè)字符串,如果有就執(zhí)行一個(gè)叫run的方法
準(zhǔn)備工作差不多了。下面動(dòng)手試試實(shí)例
方法一:通過(guò)在conf目錄下的tags.php文件 配置行為 通過(guò)\Think\Hook::listen(name);
觸發(fā)行為
我們先在Home/Conf下面準(zhǔn)備tags.php配置文件
<?php return array( 'app_app' => array('Home\Behavior\DemoShowHelloWorldBehavior'), );
根據(jù)這個(gè)配置文件,我們還得在Home/Behavior下面準(zhǔn)備DemoShowHelloWorldBehavior
的類文件
<?php namespace Home\Behavior; use Think\Controller; /** * 這個(gè)文件的類可以繼承Controller類 這樣就可以使用assign方法 * 這個(gè)方法框架里面:對(duì)你的返回值不理睬,只是用作判斷插件有沒(méi)有出錯(cuò) * 出于某個(gè)目的,筆者對(duì)Hook::listen方法作了小修改 讓他可以返回值,或許會(huì)有點(diǎn)用 */ 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; } }
這個(gè)類文件,我們是繼承的控制器,里面做了兩件事:
1.返回一個(gè)字符串
2.使用Controller方法的assign方法給模板賦值
然后我們來(lái)觸發(fā)這個(gè)行為,你只需要在控制器總寫上一下代碼以及在對(duì)應(yīng)模板中輸出對(duì)應(yīng)變量
$behaviorReturn = \Think\Hook::listen('app_app');
<div>{$behavior_assign}</div>
這樣頁(yè)面就會(huì)輸出行為類中assign的變量值了,行為類的返回值這里沒(méi)有打印,你有興趣可以打印看看哦
方法二:.通過(guò)\Think\Hook::add(name,class_namespace)
注冊(cè)一個(gè)行為,然后觸發(fā)(注冊(cè)函數(shù)必須在觸發(fā)函數(shù)之前)
這個(gè)與方法一唯一的區(qū)別就是他不用定義tags.php文件,取而代之的是一個(gè)php語(yǔ)句(如下):
\Think\Hook::add('app_app', 'Home\\Behavior\\DemoShowHelloWorldBehavior');
其他的操作都相同。
以上是“thinkPHP3.2.2框架行為擴(kuò)展的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。