ThinkPHP行为扩展Behavior应用实例详解


Posted in PHP onJuly 22, 2014

本文以实例的形式详细介绍了ThinkPHP的行为扩展Behavior的实现方法,有助于读者更灵活的掌握ThinkPHP的开发,具体步骤如下:

ThinkPHP 行为扩展 (Behavior) 流程:

最先是读取配置文件信息:

$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';

读取配置文件信息 ThinkPHP\Mode\common.php

// 行为扩展定义
'tags' => array(
'app_init'   => array(
),
'app_begin'   => array(
  'Behavior\ReadHtmlCache', // 读取静态缓存
),
'app_end'    => array(
  'Behavior\ShowPageTrace', // 页面Trace显示
),
'path_info'   => array(),
'action_begin' => array(),
'action_end'  => array(),
'view_begin'  => array(),
'view_parse'  => array(
  'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
),
'template_filter'=> array(
  'Behavior\ContentReplace', // 模板输出替换
),
'view_filter'  => array(
  'Behavior\WriteHtmlCache', // 写入静态缓存
),
'view_end'   => array(),
),

默认调用了系统行为扩展:静态缓存读取 、页面Trace显示输出、模板解析、模板内容输出替换、静态缓存写入

// 加载模式行为定义
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');

分别用Hook去加载 系统行为和自定义行为,并把配置信息保存到 Hook 私有属性$tags中

ThinkPHP\Library\Think\Think.class.php 初始化完成后会调用App::run();

ThinkPHP\Library\Think\App.class.php文件如下:

/**
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
*/
static public function run() {
// 应用初始化标签
Hook::listen('app_init');
App::init();
// 应用开始标签
Hook::listen('app_begin');
// Session初始化
if(!IS_CLI){
  session(C('SESSION_OPTIONS'));
}
// 记录应用初始化时间
G('initTime');
App::exec();
// 应用结束标签
Hook::listen('app_end');
return ;
}

 

可以看出程序在App init之前 通过钩子去监听(查看)此动作时是否有需要处理的。循环$tags['app_init']获取类名并通过类名自动执行行为扩展类run方法

所有钩子如下:

'url_dispatch'     // URL调度结束标签
'app_init'     // 应用初始化标签
'app_begin'     // 应用开始标签
'app_end'     // 应用结束标签
'action_begin'     // 动作执行前操作
'action_end'     // 动作执行后操作   
'ajax_return'     // 用于扩展其他返回格式数据
'path_info'       // 检测路由规则 如果没有则按默认规则调度URL
'template_filter'    // 模版编译过滤标签
'view_begin'      // 视图开始标签
'view_end'       // 视图结束标签
'view_parse'      // 视图解析标签
'view_filter'      // 内容过滤标签

缺点如下:

1.顺序不可控(配置文件没有专门的参数去控制顺序)如app_init同时有2个监控时先调用哪个方法。

2.监控不是全局监控内部写的太死只有一些定义好的不能通过配置文件去自动控制每一个操作的钩子(可能是考虑到性能才没有加)

优点如下:

1.可以实现了好多行为扩展

2.可以代理检测、浏览器防刷新检测、操作路由检测等

总结:

行为扩展就是在 程序某个操作时去额外的去执行某一特定功能。如程序在操作数据库 读的时候 通过explian获取性能信息并监测性能瓶颈 如出现获取数据时超过特定秒数 就把相关信息email给项目经理等。

PHP 相关文章推荐
PHP文件读写操作之文件写入代码
Jan 13 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
使用phpQuery采集网页的方法
Nov 13 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
php实现递归抓取网页类实例
Apr 03 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
PHP将数据导出Excel表中的实例(投机型)
Jul 31 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 #PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 #PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 #PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 #PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 #PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 #PHP
async和DOM Script文件加载比较
Jul 20 #PHP
You might like
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
js 如何实现对数据库的增删改查
2012/11/23 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
原生js开发的日历插件
2017/02/04 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
python利用faker库批量生成测试数据
2020/10/15 Python
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
三好学生主要事迹材料
2015/11/03 职场文书
三下乡活动心得体会
2016/01/23 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python
浅谈MySQL函数
2021/10/05 MySQL
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android