佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > thinkPHP3.2.2框架行為擴(kuò)展及demo示例

thinkPHP3.2.2框架行為擴(kuò)展及demo示例

熱門標(biāo)簽:Linux服務(wù)器 銀行業(yè)務(wù) Mysql連接數(shù)設(shè)置 團(tuán)購網(wǎng)站 電子圍欄 服務(wù)器配置 科大訊飛語音識別系統(tǒng) 阿里云

本文實例講述了thinkPHP3.2.2框架行為擴(kuò)展。分享給大家供大家參考,具體如下:

首先介紹一下行為擴(kuò)展類,本人愚鈍,還是借用tp手冊上的來說:

行為(Behavior)是一個比較抽象的概念,你可以想象成在應(yīng)用執(zhí)行過程中的一個動作或者處理,在框架的執(zhí)行流程中,各個位置都可以有行為產(chǎn)生,例如路由檢測是一個行為,靜態(tài)緩存是一個行為,用戶權(quán)限檢測也是行為,大到業(yè)務(wù)邏輯,小到瀏覽器檢測、多語言檢測等等都可以當(dāng)做是一個行為,甚至說你希望給你的網(wǎng)站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應(yīng)用,而在外圍通過擴(kuò)展或者配置來改變或者增加一些功能。

而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應(yīng)用執(zhí)行前,有些行為都是在模板輸出之后,我們把這些行為發(fā)生作用的位置稱之為標(biāo)簽(位),當(dāng)應(yīng)用程序運行到這個標(biāo)簽的時候,就會被攔截下來,統(tǒng)一執(zhí)行相關(guān)的行為,類似于AOP編程中的“切面”的概念,給某一個切面綁定相關(guān)行為就成了一種類AOP編程的思想。

那下面就入正題,講解一下行為(Behavior)的實例

讓行為工作有兩種方式:

1.通過在conf目錄下的tags.php文件  配置行為   通過\Think\Hook::listen(name);觸發(fā)行為

2.通過\Think\Hook::add(name,class_namespace) 注冊一個行為,然后觸發(fā)(注冊函數(shù)必須在觸發(fā)函數(shù)之前)

在我們講解實例之前,很有必要先講講行為是怎么觸發(fā)的。

行為觸發(fā)靠的是\Think\Hook::listen(name)方法,那方法里面到底做了什么,我們先看看源碼:

/**
 * 監(jiān)聽標(biāo)簽的插件
 * @param string $tag 標(biāo)簽名稱
 * @param mixed $params 傳入?yún)?shù)
 * @return void
 */
/**
 * add by yangligao 2014/8/25
 * listen 個人覺得方法名稱取得不怎么好理解,看程序中就知道這個方法實際上就是看$tags中有沒有參數(shù)中的tag
 *   如果有,就觸發(fā)之;
 *   如果沒有,你懂的,過之(至少程序中是沒有做操作)。
 */
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;//筆者^_^自己添加的
}

這個方法里面記錄行為的一些運行狀態(tài)的值,函數(shù)最后一點筆者做了一點修改,只是讓這個方法有了一份返回值(而非返回空)

最重要的地方就是

$result = self::exec($name, $tag,$params);

這個地方就開始執(zhí)行所謂的行為了,先看看exec方法的源碼

 /**
  * 執(zhí)行某個插件
  * @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);
 }

這個方法所做的就是先判斷行為配置中的設(shè)定的類名中是否有Behavior這個字符串,如果有就執(zhí)行一個叫run的方法

準(zhǔn)備工作差不多了。下面動手試試實例

方法一:通過在conf目錄下的tags.php文件  配置行為   通過\Think\Hook::listen(name);觸發(fā)行為

我們先在Home/Conf下面準(zhǔn)備tags.php配置文件

?php
return array(
  'app_app' => array('Home\Behavior\DemoShowHelloWorldBehavior'),
);

根據(jù)這個配置文件,我們還得在Home/Behavior下面準(zhǔn)備DemoShowHelloWorldBehavior的類文件

?php
namespace 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方法給模板賦值

然后我們來觸發(fā)這個行為,你只需要在控制器總寫上一下代碼以及在對應(yīng)模板中輸出對應(yīng)變量

$behaviorReturn = \Think\Hook::listen('app_app');

div>{$behavior_assign}/div>

這樣頁面就會輸出行為類中assign的變量值了,行為類的返回值這里沒有打印,你有興趣可以打印看看哦

方法二:.通過\Think\Hook::add(name,class_namespace) 注冊一個行為,然后觸發(fā)(注冊函數(shù)必須在觸發(fā)函數(shù)之前)

這個與方法一唯一的區(qū)別就是他不用定義tags.php文件,取而代之的是一個php語句(如下):

\Think\Hook::add('app_app', 'Home\\Behavior\\DemoShowHelloWorldBehavior');

其他的操作都相同。

更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術(shù)總結(jié)》。

希望本文所述對大家基于ThinkPHP框架的PHP程序設(shè)計有所幫助。

您可能感興趣的文章:
  • Thinkphp5框架簡單實現(xiàn)鉤子(Hook)行為的方法示例
  • thinkPHP基于反射實現(xiàn)鉤子的方法分析
  • thinkPHP中鉤子的使用方法實例分析
  • thinkPHP中鉤子的兩種配置調(diào)用方法詳解
  • ThinkPHP行為擴(kuò)展Behavior應(yīng)用實例詳解
  • Thinkphp5行為使用方法匯總
  • 老生常談ThinkPHP中的行為擴(kuò)展和插件(推薦)
  • thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動,行為,命名空間等】
  • Thinkphp 框架擴(kuò)展之行為擴(kuò)展原理與實現(xiàn)方法分析
  • thinkphp5.1 框架鉤子和行為用法實例分析

標(biāo)簽:蚌埠 棗莊 廣元 大理 萍鄉(xiāng) 衡水 衢州 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《thinkPHP3.2.2框架行為擴(kuò)展及demo示例》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    峨山| 陵水| 武清区| 阳春市| 荆门市| 桐乡市| 高密市| 通榆县| 定兴县| 纳雍县| 禹州市| 安国市| 日土县| 扬中市| 汶川县| 五原县| 于都县| 外汇| 嵊州市| 德兴市| 黄浦区| 赣州市| 桑植县| 婺源县| 马鞍山市| 青浦区| 西乌| 天全县| 五华县| 荣昌县| 高密市| 鄂尔多斯市| 天镇县| 永顺县| 木里| 渑池县| 瓮安县| 同德县| 三都| 久治县| 航空|