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 相关文章推荐
jQuery 源码分析笔记
May 25 PHP
PHP优于Node.js的五大理由分享
Sep 15 PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
PHP多个图片压缩成ZIP的方法
Aug 18 PHP
php定期拉取数据对比方法实例
Sep 22 PHP
Laravel框架Blade模板简介及模板继承用法分析
Dec 03 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 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安装问题
2006/10/09 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
PHP多维数组排序array详解
2017/11/21 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
Javascript 日期处理之时区问题
2009/10/08 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
python中Genarator函数用法分析
2015/04/08 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
出纳员的岗位职责
2014/02/22 职场文书
征婚广告词
2014/03/17 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
七年级思品教学反思
2016/02/20 职场文书
python turtle绘图命令及案例
2021/11/23 Python