老生常谈ThinkPHP中的行为扩展和插件(推荐)
发布时间 - 2026-01-11 00:59:24 点击率:次原理分析

将标签与类之间的对应关系(如'app_init'=>array('Common\Behavior\InitHook')),通过Hook类中import或add方法,加载到Hook类中静态变量$tags中。当执行Hook中静态方法listen或者exec方法的时候(listen方法中调用了exec),实例化标签对应的类,调用相应的方法(如果是插件,调用传递的方法,如果是行为,调用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中的行为
加载标签与类之间的对应关系
// 加载模式行为定义
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}
// 加载应用行为定义
if(is_file(CONF_PATH.'tags.php'))
// 允许应用增加开发模式配置定义
Hook::import(include CONF_PATH.'tags.php');
模式行为对应关系
在ThinkPHP/Mode/common.php中tags标签中定义
'tags' => array(
'app_begin' => array(
'Behavior\ReadHtmlCache', // 读取静态缓存
),
'app_end' => array(
'Behavior\ShowPageTrace', // 页面Trace显示
),
'view_parse' => array(
'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
),
'template_filter'=> array(
'Behavior\ContentReplace', // 模板输出替换
),
'view_filter' => array(
'Behavior\WriteHtmlCache', // 写入静态缓存
),
)
应用行为对应关系
在Application/Common/Conf/tags.php中定义
调用相应的行为
如Hook::listen('app_begin')相当于调用Behavior\ReadHtmlCache中的run方法。找到该类,可以查看其对应的run方法如下
自定义行为
1.在Application/Common/Conf/tags.php中添加对应关系
'dqs_behavior'=>array('Common\Behavior\Dqs')
将对应关系添加到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('调用了行为Dqs');
echo '</pre>';
}
}
其中Behavior 类为ThinkPHP自带的抽象类
3.调用行为
效果如下图
自定义插件
1.定义插件文件
通过查看Hook文件中插件类实例化方式($class = "Addons\\{$name}\\{$name}Addon";),可以得知,如果想定义一个名为Dqs的插件,应该在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.注册插件
所谓的注册插件,就是将插件的标签与类之间的对应关系,添加到Hook类中静态变量$tags中。对应行为来说,标识符仅仅是一个标识符,可以定义任意的标识符,但是对应插件来说,标识符不能随意定义,因为插件的标识符代表的是插件的方法名。所以上面的插件注册代码如下
\Think\Hook::add('dqsTrace',array('Dqs'));
3.调用插件
$params=array('name'=>'dqs');
\Think\Hook::listen('dqsTrace',$params);
效果如下
以上这篇老生常谈ThinkPHP中的行为扩展和插件(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# thinkphp
# 行为扩展
# Thinkphp5框架简单实现钩子(Hook)行为的方法示例
# thinkPHP基于反射实现钩子的方法分析
# thinkPHP中钩子的使用方法实例分析
# thinkPHP中钩子的两种配置调用方法详解
# ThinkPHP行为扩展Behavior应用实例详解
# Thinkphp5行为使用方法汇总
# thinkPHP5.0框架整体架构总览【应用
# 模块
# MVC
# 驱动
# 行为
# 命名空间等】
# thinkPHP3.2.2框架行为扩展及demo示例
# Thinkphp 框架扩展之行为扩展原理与实现方法分析
# thinkphp5.1 框架钩子和行为用法实例分析
# 加载
# 类中
# 给大家
# 自定义
# 的是
# 是一个
# 多个
# 老生常谈
# 将其
# 也可
# 希望能
# 只有一个
# 这篇
# 自带
# 第三方
# 主要用于
# 小编
# 大家多多
# 可以查看
# 如下图
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Swift开发中switch语句值绑定模式
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
JS经典正则表达式笔试题汇总
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
如何挑选最适合建站的高性能VPS主机?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
如何撰写建站申请书?关键要点有哪些?
Firefox Developer Edition开发者版本入口
英语简历制作免费网站推荐,如何将简历翻译成英文?
详解Android中Activity的四大启动模式实验简述
JS去除重复并统计数量的实现方法
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
北京专业网站制作设计师招聘,北京白云观官方网站?
python中快速进行多个字符替换的方法小结
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
如何确认建站备案号应放置的具体位置?
高防服务器:AI智能防御DDoS攻击与数据安全保障
太平洋网站制作公司,网络用语太平洋是什么意思?
如何快速辨别茅台真假?关键步骤解析
如何在景安云服务器上绑定域名并配置虚拟主机?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
网站建设要注意的标准 促进网站用户好感度!
Laravel如何使用模型观察者?(Observer代码示例)
音响网站制作视频教程,隆霸音响官方网站?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何在不使用负向后查找的情况下匹配特定条件前的换行符
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Python3.6正式版新特性预览
如何在IIS服务器上快速部署高效网站?
如何在阿里云完成域名注册与建站?
zabbix利用python脚本发送报警邮件的方法
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
JavaScript Ajax实现异步通信
高端企业智能建站程序:SEO优化与响应式模板定制开发
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
iOS发送验证码倒计时应用
Java类加载基本过程详细介绍

