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 相关文章推荐
一个用于网络的工具函数库
Oct 09 PHP
PHP 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
php smarty 二级分类代码和模版循环例子
Jun 01 PHP
PHP 导出Excel示例分享
Aug 18 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
Jan 12 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 PHP
laravel框架语言包拓展实现方法分析
Nov 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
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
两个php日期控制类实例
2014/12/09 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
Python 字典(Dictionary)操作详解
2014/03/11 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
儿童编程python入门
2018/05/08 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
windows支持哪个版本的python
2020/07/03 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
物业管理个人自我评价
2013/11/08 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
小学语文国培研修日志
2015/11/13 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android