老生常谈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类加载基本过程详细介绍