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基础学习笔记
Mar 18 PHP
使用PHP实现密保卡功能实现代码<打包下载直接运行>
Oct 09 PHP
PHP安全防范技巧分享
Nov 03 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
用PHP和Shell写Hadoop的MapReduce程序
Apr 15 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
Aug 21 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
基于PHP制作验证码
Oct 12 PHP
PHP fprintf()函数用法讲解
Feb 16 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
ie6 动态缩略图不显示的原因
2009/06/21 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
python实例化对象的具体方法
2020/06/17 Python
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
什么是类的返射机制
2016/02/06 面试题
网站开发实习生的自我评价
2013/12/11 职场文书
仓库规划计划书
2014/04/28 职场文书
跳槽求职信范文
2014/05/26 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
辞职书格式样本
2015/02/26 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python