老生常谈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获取网卡地址的代码
Apr 09 PHP
PHP Mysql编程之高级技巧
Aug 27 PHP
php cookie 登录验证示例代码
Mar 16 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
php读取文件内容到数组的方法
Mar 16 PHP
PHP获取文件行数的方法
Jun 10 PHP
php二维码生成
Oct 19 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 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
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
js+html5实现canvas绘制镂空字体文本的方法
2015/06/05 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
vue中如何使用ztree
2018/02/06 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
vue实现购物车案例
2020/05/30 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
python字符串常用方法
2018/06/14 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
tornado+celery的简单使用详解
2019/12/21 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
初中同学聚会邀请函
2014/02/03 职场文书
药品营销策划方案
2014/06/15 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
python使用shell脚本创建kafka连接器
2022/04/29 Python
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL