老生常谈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 相关文章推荐
PHP动态变静态原理
Nov 25 PHP
cmd下运行php脚本
Nov 25 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
解析php中memcache的应用
Jun 18 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
Nov 29 PHP
微信公众号实现会员卡领取功能
Jun 08 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 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
web方式ftp
2006/10/09 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
如何用Python实现简单的Markdown转换器
2018/07/16 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
python让函数不返回结果的方法
2020/06/22 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
不用游标的SQL语句有哪些
2012/09/07 面试题
大课间体育活动方案
2014/03/12 职场文书
货车司机岗位职责
2014/03/18 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
项目验收申请报告
2015/05/15 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
情感电台广播稿
2015/08/18 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python