thinkPHP3.2.2框架行為擴(kuò)展及demo示例
本文實(shí)例講述了thinkPHP3.2.2框架行為擴(kuò)展。分享給大家供大家參考,具體如下:
首先介紹一下行為擴(kuò)展類,本人愚鈍,還是借用tp手冊上的來說:
行為(Behavior)是一個(gè)比較抽象的概念,你可以想象成在應(yīng)用執(zhí)行過程中的一個(gè)動(dòng)作或者處理,在框架的執(zhí)行流程中,各個(gè)位置都可以有行為產(chǎn)生,例如路由檢測是一個(gè)行為,靜態(tài)緩存是一個(gè)行為,用戶權(quán)限檢測也是行為,大到業(yè)務(wù)邏輯,小到瀏覽器檢測、多語言檢測等等都可以當(dāng)做是一個(gè)行為,甚至說你希望給你的網(wǎng)站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動(dòng)框架和應(yīng)用,而在外圍通過擴(kuò)展或者配置來改變或者增加一些功能。
而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應(yīng)用執(zhí)行前,有些行為都是在模板輸出之后,我們把這些行為發(fā)生作用的位置稱之為標(biāo)簽(位),當(dāng)應(yīng)用程序運(yùn)行到這個(gè)標(biāo)簽的時(shí)候,就會被攔截下來,統(tǒng)一執(zhí)行相關(guān)的行為,類似于AOP編程中的“切面”的概念,給某一個(gè)切面綁定相關(guān)行為就成了一種類AOP編程的思想。
那下面就入正題,講解一下行為(Behavior)的實(shí)例
讓行為工作有兩種方式:
1.通過在conf目錄下的tags.php文件 配置行為 通過\Think\Hook::listen(name);觸發(fā)行為
2.通過\Think\Hook::add(name,class_namespace) 注冊一個(gè)行為,然后觸發(fā)(注冊函數(shù)必須在觸發(fā)函數(shù)之前)
在我們講解實(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 個(gè)人覺得方法名稱取得不怎么好理解,看程序中就知道這個(gè)方法實(shí)際上就是看$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;//筆者^_^自己添加的
}
這個(gè)方法里面記錄行為的一些運(yùn)行狀態(tài)的值,函數(shù)最后一點(diǎn)筆者做了一點(diǎn)修改,只是讓這個(gè)方法有了一份返回值(而非返回空)
最重要的地方就是
$result = self::exec($name, $tag,$params);
這個(gè)地方就開始執(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í)例
方法一:通過在conf目錄下的tags.php文件 配置行為 通過\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è)方法框架里面:對你的返回值不理睬,只是用作判斷插件有沒有出錯(cuò)
* 出于某個(gè)目的,筆者對Hook::listen方法作了小修改 讓他可以返回值,或許會有點(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方法給模板賦值
然后我們來觸發(fā)這個(gè)行為,你只需要在控制器總寫上一下代碼以及在對應(yīng)模板中輸出對應(yīng)變量
$behaviorReturn = \Think\Hook::listen('app_app');
<div>{$behavior_assign}</div>
這樣頁面就會輸出行為類中assign的變量值了,行為類的返回值這里沒有打印,你有興趣可以打印看看哦
方法二:.通過\Think\Hook::add(name,class_namespace) 注冊一個(gè)行為,然后觸發(fā)(注冊函數(shù)必須在觸發(fā)函數(shù)之前)
這個(gè)與方法一唯一的區(qū)別就是他不用定義tags.php文件,取而代之的是一個(gè)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è)計(jì)有所幫助。
- Thinkphp5框架簡單實(shí)現(xiàn)鉤子(Hook)行為的方法示例
- thinkPHP基于反射實(shí)現(xiàn)鉤子的方法分析
- thinkPHP中鉤子的使用方法實(shí)例分析
- thinkPHP中鉤子的兩種配置調(diào)用方法詳解
- ThinkPHP行為擴(kuò)展Behavior應(yīng)用實(shí)例詳解
- Thinkphp5行為使用方法匯總
- 老生常談ThinkPHP中的行為擴(kuò)展和插件(推薦)
- thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等】
- Thinkphp 框架擴(kuò)展之行為擴(kuò)展原理與實(shí)現(xiàn)方法分析
- thinkphp5.1 框架鉤子和行為用法實(shí)例分析
相關(guān)文章
PHP的反射類ReflectionClass、ReflectionMethod使用實(shí)例
這篇文章主要介紹了PHP的反射類ReflectionClass、ReflectionMethod使用實(shí)例,本文同時(shí)介紹了反射是什么、反射可以做哪些事情,并給出一個(gè)具體例子,是一篇不錯(cuò)的入門文章,需要的朋友可以參考下2014-08-08
laravel Task Scheduling(任務(wù)調(diào)度)在windows下的使用詳解
今天小編就為大家分享一篇laravel Task Scheduling(任務(wù)調(diào)度)在windows下的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
php實(shí)現(xiàn)12306火車票余票查詢和價(jià)格查詢(12306火車票查詢)
這篇文章主要介紹了使用php實(shí)現(xiàn)的12306火車票余票查詢和價(jià)格查詢功能,大家參考使用吧2014-01-01
Apache啟動(dòng)報(bào)錯(cuò)No space left on device: AH00023該怎么解決
最近有朋友說:Apache啟動(dòng)報(bào)錯(cuò)No space left on device: AH00023,是怎么回事,該怎么解決呢?經(jīng)過小編的一番折騰,問題解決,下面把解決辦法分享給大家,需要的朋友可以參考下2015-10-10
WordPress中設(shè)置Post Type自定義文章類型的實(shí)例教程
這篇文章主要介紹了WordPress中設(shè)置Post Type自定義文章類型的實(shí)例教程,后臺文章類型的設(shè)置是WordPress的一大特色,然而自帶的文章類型往往并不夠用,需要的朋友可以參考下2016-05-05
ThinkPHP 3.2.2實(shí)現(xiàn)事務(wù)操作的方法
這篇文章主要介紹了ThinkPHP 3.2.2實(shí)現(xiàn)事務(wù)操作的方法,簡單分析了thinkPHP中事務(wù)的啟動(dòng)、提交、回滾等操作方法并給出了完整的事務(wù)提交與回滾操作實(shí)例,需要的朋友可以參考下2017-05-05
YII框架學(xué)習(xí)筆記之命名空間、操作響應(yīng)與視圖操作示例
這篇文章主要介紹了YII框架學(xué)習(xí)筆記之命名空間、操作響應(yīng)與視圖操作,結(jié)合實(shí)例形式分析了Yii框架中命名空間、操作響應(yīng)以及視圖的簡單操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-04-04

