老生常談ThinkPHP中的行為擴展和插件(推薦)
原理分析
將標簽與類之間的對應(yīng)關(guān)系(如'app_init'=>array('Common\Behavior\InitHook')),通過Hook類中import或add方法,加載到Hook類中靜態(tài)變量$tags中。當執(zhí)行Hook中靜態(tài)方法listen或者exec方法的時候(listen方法中調(diào)用了exec),實例化標簽對應(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{
// 行為擴展(只有一個run入口方法)
$class = $name.'Behavior';
$tag = 'run';
}
$addon = new $class();
return $addon->$tag($params);
}
ThinkPHP中的行為
加載標簽與類之間的對應(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標簽中定義
'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')相當于調(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變量中,當然也可通過使用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.注冊插件
所謂的注冊插件,就是將插件的標簽與類之間的對應(yīng)關(guān)系,添加到Hook類中靜態(tài)變量$tags中。對應(yīng)行為來說,標識符僅僅是一個標識符,可以定義任意的標識符,但是對應(yīng)插件來說,標識符不能隨意定義,因為插件的標識符代表的是插件的方法名。所以上面的插件注冊代碼如下
\Think\Hook::add('dqsTrace',array('Dqs'));
3.調(diào)用插件
$params=array('name'=>'dqs');
\Think\Hook::listen('dqsTrace',$params);
效果如下

以上這篇老生常談ThinkPHP中的行為擴展和插件(推薦)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Thinkphp5框架簡單實現(xiàn)鉤子(Hook)行為的方法示例
- thinkPHP基于反射實現(xiàn)鉤子的方法分析
- thinkPHP中鉤子的使用方法實例分析
- thinkPHP中鉤子的兩種配置調(diào)用方法詳解
- ThinkPHP行為擴展Behavior應(yīng)用實例詳解
- Thinkphp5行為使用方法匯總
- thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動,行為,命名空間等】
- thinkPHP3.2.2框架行為擴展及demo示例
- Thinkphp 框架擴展之行為擴展原理與實現(xiàn)方法分析
- thinkphp5.1 框架鉤子和行為用法實例分析
相關(guān)文章
thinkphp隱藏index.php/home并允許訪問其他模塊的實現(xiàn)方法
這篇文章主要介紹了thinkphp隱藏index.php/home并允許訪問其他模塊的實現(xiàn)方法,想要達成的效果很簡單,我有兩個模塊,Home、Wechat。具體詳情請參考下本文。感興趣的朋友一起看看吧2016-10-10
PHP對稱加密算法(DES/AES)類的實現(xiàn)代碼
本篇文章主要介紹了PHP對稱加密算法(DES/AES)類的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安裝配置圖文教程 2009年
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安裝配置教程 2009年最新版2009-06-06

