老生常谈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 】
相关推荐:
,南京靠谱的征婚网站?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
java中使用zxing批量生成二维码立牌
如何注册花生壳免费域名并搭建个人网站?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何在腾讯云服务器上快速搭建个人网站?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
音响网站制作视频教程,隆霸音响官方网站?
Laravel怎么实现模型属性的自动加密
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
QQ浏览器网页版登录入口 个人中心在线进入
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何快速配置高效服务器建站软件?
如何在云服务器上快速搭建个人网站?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
javascript中对象的定义、使用以及对象和原型链操作小结
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
如何快速选择适合个人网站的云服务器配置?
如何用西部建站助手快速创建专业网站?
nginx修改上传文件大小限制的方法
微信小程序 HTTPS报错整理常见问题及解决方案
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何基于云服务器快速搭建网站及云盘系统?
深圳网站制作的公司有哪些,dido官方网站?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何在云主机快速搭建网站站点?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Laravel如何使用Livewire构建动态组件?(入门代码)
怎么用AI帮你为初创公司进行市场定位分析?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
如何快速搭建二级域名独立网站?
如何为不同团队 ID 动态生成多个“认领值班”按钮
如何为不同团队 ID 动态生成多个独立按钮
如何快速上传自定义模板至建站之星?
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
,交易猫的商品怎么发布到网站上去?
Laravel如何实现数据库事务?(DB Facade示例)
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】

