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版(5)
Oct 09 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
Nov 01 PHP
openPNE常用方法分享
Nov 29 PHP
PHP的几个常用数字判断函数代码
Apr 24 PHP
PHP冒泡算法详解(递归实现)
Nov 10 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
php进程间通讯实例分析
Jul 11 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
PHP实现负载均衡下的session共用功能
Apr 17 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中的MVC模式运用技巧
2007/05/03 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
ie支持function.bind()方法实现代码
2012/12/27 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
下载给定网页上图片的方法
2014/02/18 Python
pyqt4教程之widget使用示例分享
2014/03/07 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
浅析使用Python操作文件
2017/07/31 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
python numpy数组复制使用实例解析
2020/01/10 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
EJB的角色和三个对象
2015/12/31 面试题
运动会通讯稿300字
2014/02/02 职场文书
幸福家庭标语
2014/06/27 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang