老生常谈ThinkPHP中的行为扩展和插件(推荐)


Posted in PHP onMay 05, 2017

原理分析

将标签与类之间的对应关系(如'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中定义

调用相应的行为

老生常谈ThinkPHP中的行为扩展和插件(推荐)

如Hook::listen('app_begin')相当于调用Behavior\ReadHtmlCache中的run方法。找到该类,可以查看其对应的run方法如下

老生常谈ThinkPHP中的行为扩展和插件(推荐)

自定义行为

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.调用行为

老生常谈ThinkPHP中的行为扩展和插件(推荐)

效果如下图

老生常谈ThinkPHP中的行为扩展和插件(推荐)

自定义插件

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中的行为扩展和插件(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
从MySQL数据库表中取出随机数据的代码
Sep 05 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
is_uploaded_file函数引发的不能上传文件问题
Oct 29 PHP
PHP+MySQL删除操作实例
Jan 21 PHP
PHP遍历数组的三种方法及效率对比分析
Feb 12 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
Laravel 5.3 学习笔记之 配置
Aug 28 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
May 05 #PHP
php 浮点数比较方法详解
May 05 #PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
May 05 #PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 #PHP
Yii2配置Nginx伪静态的方法
May 05 #PHP
php生成网页桌面快捷方式
May 05 #PHP
php 如何设置一个严格控制过期时间的session
May 05 #PHP
You might like
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
JS常见算法详解
2017/02/28 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
python分割文件的常用方法
2014/11/01 Python
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
python删除过期文件的方法
2015/05/29 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
python文件读取失败怎么处理
2020/06/23 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
长安大学毕业生自我鉴定
2014/01/17 职场文书
30岁生日感言
2014/01/25 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
创新比赛获奖感言
2014/02/13 职场文书
继承公证书
2014/04/09 职场文书
献爱心活动总结
2014/05/07 职场文书
骨干教师考核方案
2014/05/09 职场文书
应届毕业生自荐书
2014/06/18 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
入党申请书怎么写?
2019/06/11 职场文书