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+DBM的同学录程序(4)
Oct 09 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
May 04 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
php中 $$str 中 "$$" 的详解
Jul 06 PHP
php+curl 发送图片处理代码分享
Jul 09 PHP
php+html5基于websocket实现聊天室的方法
Jul 17 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php at(@)符号的用法简介
2009/07/11 PHP
PHP输出时间差函数代码
2013/01/28 PHP
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python读取网页内容的方法
2015/07/30 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
Python request使用方法及问题总结
2020/04/26 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
什么是网络协议
2016/04/07 面试题
执行力心得体会
2013/12/31 职场文书
初婚初育证明
2014/01/14 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
党委领导班子整改方案
2014/09/30 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
办公室管理规章制度
2015/08/04 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python