老生常谈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得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
实现获取http内容的php函数分享
Feb 16 PHP
php绘制一条弧线的方法
Jan 24 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
php array_values 返回数组的所有值详解及实例
Nov 12 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP PDOStatement::execute讲解
Jan 31 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 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
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
canvas绘制七巧板
2017/02/03 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
简介Django框架中可使用的各类缓存
2015/07/23 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Python读取properties配置文件操作示例
2018/03/29 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
详解Python高阶函数
2020/08/15 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
北大自主招生自荐信
2013/10/19 职场文书
药学专业大学生个人的自我评价
2013/11/04 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
文体活动总结范文
2014/05/05 职场文书
离婚协议书怎么写
2014/09/12 职场文书
大班下学期个人总结
2015/02/13 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书