老生常談ThinkPHP中的行為擴(kuò)展和插件(推薦)
原理分析
將標(biāo)簽與類之間的對應(yīng)關(guān)系(如'app_init'=>array('Common\Behavior\InitHook')),通過Hook類中import或add方法,加載到Hook類中靜態(tài)變量$tags中。當(dāng)執(zhí)行Hook中靜態(tài)方法listen或者exec方法的時候(listen方法中調(diào)用了exec),實例化標(biāo)簽對應(yīng)的類,調(diào)用相應(yīng)的方法(如果是插件,調(diào)用傳遞的方法,如果是行為,調(diào)用run方法)。
Hook中exec方法定義如下:
static public function exec($name, $tag,&$params=NULL) {
if(false === strpos($name,'\\')) {
// 插件(多個入口)
$class = "Addons\\{$name}\\{$name}Addon";
}else{
// 行為擴(kuò)展(只有一個run入口方法)
$class = $name.'Behavior';
$tag = 'run';
}
$addon = new $class();
return $addon->$tag($params);
}
ThinkPHP中的行為
加載標(biāo)簽與類之間的對應(yīng)關(guān)系
// 加載模式行為定義
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}
// 加載應(yīng)用行為定義
if(is_file(CONF_PATH.'tags.php'))
// 允許應(yīng)用增加開發(fā)模式配置定義
Hook::import(include CONF_PATH.'tags.php');
模式行為對應(yīng)關(guān)系
在ThinkPHP/Mode/common.php中tags標(biāo)簽中定義
'tags' => array(
'app_begin' => array(
'Behavior\ReadHtmlCache', // 讀取靜態(tài)緩存
),
'app_end' => array(
'Behavior\ShowPageTrace', // 頁面Trace顯示
),
'view_parse' => array(
'Behavior\ParseTemplate', // 模板解析 支持PHP、內(nèi)置模板引擎和第三方模板引擎
),
'template_filter'=> array(
'Behavior\ContentReplace', // 模板輸出替換
),
'view_filter' => array(
'Behavior\WriteHtmlCache', // 寫入靜態(tài)緩存
),
)
應(yīng)用行為對應(yīng)關(guān)系
在Application/Common/Conf/tags.php中定義
調(diào)用相應(yīng)的行為

如Hook::listen('app_begin')相當(dāng)于調(diào)用Behavior\ReadHtmlCache中的run方法。找到該類,可以查看其對應(yīng)的run方法如下

自定義行為
1.在Application/Common/Conf/tags.php中添加對應(yīng)關(guān)系
'dqs_behavior'=>array('Common\Behavior\Dqs')
將對應(yīng)關(guān)系添加到tags.php,程序會自動將其加載到Hook的$tags變量中,當(dāng)然也可通過使用Hook中的add方法手動加載。
2.定義Common\Behavior\DqsBehavior類
<?php
namespace Common\Behavior;
use Think\Behavior;
defined('THINK_PATH') or exit();
class DqsBehavior extends Behavior {
public function run(&$content){
echo '<pre>';
print_r('調(diào)用了行為Dqs');
echo '</pre>';
}
}
其中Behavior 類為ThinkPHP自帶的抽象類
3.調(diào)用行為

效果如下圖

自定義插件
1.定義插件文件
通過查看Hook文件中插件類實例化方式($class = "Addons\\{$name}\\{$name}Addon";),可以得知,如果想定義一個名為Dqs的插件,應(yīng)該在Addons/Dqs目錄下定義DqsAddon.class.php文件。程序如下:
<?php
namespace Addons\Dqs;
class DqsAddon{
public $info = array(
'name'=>'Editor',
'title'=>'dqs測試插件',
'description'=>'主要用于輸出',
'status'=>1,
'author'=>'lidequan',
'version'=>'0.1'
);
public function dqsTrace($pa){
echo '<pre>';
print_r($pa);
echo '</pre>';
}
}
2.注冊插件
所謂的注冊插件,就是將插件的標(biāo)簽與類之間的對應(yīng)關(guān)系,添加到Hook類中靜態(tài)變量$tags中。對應(yīng)行為來說,標(biāo)識符僅僅是一個標(biāo)識符,可以定義任意的標(biāo)識符,但是對應(yīng)插件來說,標(biāo)識符不能隨意定義,因為插件的標(biāo)識符代表的是插件的方法名。所以上面的插件注冊代碼如下
\Think\Hook::add('dqsTrace',array('Dqs'));
3.調(diào)用插件
$params=array('name'=>'dqs');
\Think\Hook::listen('dqsTrace',$params);
效果如下

以上這篇老生常談ThinkPHP中的行為擴(kuò)展和插件(推薦)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Thinkphp5框架簡單實現(xiàn)鉤子(Hook)行為的方法示例
- thinkPHP基于反射實現(xiàn)鉤子的方法分析
- thinkPHP中鉤子的使用方法實例分析
- thinkPHP中鉤子的兩種配置調(diào)用方法詳解
- ThinkPHP行為擴(kuò)展Behavior應(yīng)用實例詳解
- Thinkphp5行為使用方法匯總
- thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動,行為,命名空間等】
- thinkPHP3.2.2框架行為擴(kuò)展及demo示例
- Thinkphp 框架擴(kuò)展之行為擴(kuò)展原理與實現(xiàn)方法分析
- thinkphp5.1 框架鉤子和行為用法實例分析
相關(guān)文章
php使用curl和正則表達(dá)式抓取網(wǎng)頁數(shù)據(jù)示例
這篇文章主要介紹了php使用curl和正則表達(dá)式抓取網(wǎng)頁數(shù)據(jù)示例,這里是抓取某網(wǎng)站的小說,需要的朋友可以修改一下抓取其它數(shù)據(jù)2014-04-04
yii實現(xiàn)CheckBox復(fù)選框在同一行顯示的方法
這篇文章主要介紹了yii實現(xiàn)CheckBox復(fù)選框在同一行顯示的方法,對比了網(wǎng)上搜集的方法,給出了改進(jìn)的意見,非常具有實用價值,需要的朋友可以參考下2014-12-12
php array_values 返回數(shù)組的值實例詳解
php array_values 函數(shù)用于返回數(shù)組中所有的值,注意該函數(shù)將為新數(shù)組建立數(shù)組索引,原來的文字索引將不存在。本文章向大家講解array_values函數(shù)的基本語法及使用實例,需要的朋友可以參考下2016-11-11
php實例分享之通過遞歸實現(xiàn)刪除目錄下的所有文件詳解
最近遇到一個實際問題,需要清空制定目錄下的所有文件及清空數(shù)據(jù)庫。清空數(shù)據(jù)庫不難,但要如何遞歸刪除一個目錄下的所有文件呢。 于是去網(wǎng)上研究了下資料再加上自己琢磨解決了這一問題。2014-05-05
PHP+Mysql+Ajax實現(xiàn)淘寶客服或阿里旺旺聊天功能(前臺頁面)
這篇文章主要介紹了用php+mysql+ajax實現(xiàn)淘寶客服或阿里旺旺聊天功能之前臺頁面,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06
Laravel5.4框架中視圖共享數(shù)據(jù)的方法詳解
這篇文章主要介紹了Laravel5.4框架中視圖共享數(shù)據(jù)的方法,結(jié)合實例形式詳細(xì)分析了Laravel框架視圖共享數(shù)據(jù)的原理、步驟與相關(guān)操作注意事項,需要的朋友可以參考下2019-09-09

