老生常谈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执行速度全攻略
Oct 09 PHP
php实现的MySQL通用查询程序
Mar 11 PHP
php下通过IP获取地理位置的代码(小偷程序)
Jun 09 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
Sep 27 PHP
thinkphp循环结构用法实例
Nov 24 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
一个非常实用的php文件上传类
Jul 04 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实现的简单中文验证码功能示例
2017/01/03 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
vue实现评论列表功能
2019/10/25 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
Python算术运算符实例详解
2017/05/31 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
python实现反转部分单向链表
2018/09/27 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Django 自动生成api接口文档教程
2019/11/19 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
小学二年级学生评语
2014/04/21 职场文书
怎样写离婚协议书
2015/01/26 职场文书
儿子满月酒致辞
2015/07/29 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL
python中opencv实现图片文本倾斜校正
2021/06/11 Python
浅谈Python协程asyncio
2021/06/20 Python
css3新特性的应用示例分析
2022/03/16 HTML / CSS
4种方法python批量修改替换列表中元素
2022/04/07 Python