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的面试题集,附我的答案和分析(一)
Nov 19 PHP
php下mysql数据库操作类(改自discuz)
Jul 03 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
linux下安装php的memcached客户端
Aug 03 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
php中使用websocket详解
Sep 23 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
javascript读取xml实现javascript分页
2013/12/13 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
js实现随机点名程序
2020/09/17 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
详解python播放音频的三种方法
2019/09/23 Python
python matplotlib拟合直线的实现
2019/11/19 Python
python已协程方式处理任务实现过程
2019/12/27 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
Python中私有属性的定义方式
2020/03/05 Python
python 实现Harris角点检测算法
2020/12/11 Python
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
优秀的自荐信要注意哪些
2014/01/03 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
大学毕业感言一句话
2014/02/06 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
党员个人对照检查材料
2014/10/01 职场文书
务工证明怎么写
2015/06/18 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python