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 magic_quotes_gpc的一点认识与分析
Aug 18 PHP
PHP n个不重复的随机数生成代码
Jun 23 PHP
基于Zookeeper的使用详解
May 02 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
Nov 18 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
Nov 05 PHP
php mysql操作mysql_connect连接数据库实例详解
Dec 26 PHP
PHP 代码简洁之道(小结)
Oct 16 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 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获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php下使用iconv需要注意的问题
2010/11/20 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
PHP实现事件机制的方法
2015/07/10 PHP
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
js中function()使用方法
2013/12/24 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python实现dijkstra最短路由算法
2019/01/17 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
管理站站长岗位职责
2013/11/27 职场文书
总经理助理工作职责
2014/02/06 职场文书
《落花生》教学反思
2014/02/25 职场文书
高三学生评语大全
2014/04/25 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
MySql分区类型及创建分区的方法
2022/04/13 MySQL