老生常谈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 相关文章推荐
php4的彩蛋
Oct 09 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
解析在zend Farmework下如何创立一个FORM表单
Jun 28 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
php构造函数的继承方法
Feb 09 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP针对redis常用操作实例详解
Aug 17 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php与paypal整合方法
2010/11/28 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
PHP钩子实现方法解析
2019/05/21 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
Python下singleton模式的实现方法
2014/07/16 Python
python使用psutil模块获取系统状态
2016/08/27 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
python 实现Harris角点检测算法
2020/12/11 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
教师档案管理制度
2014/01/23 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
小学教师教学反思
2016/02/24 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL