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 相关文章推荐
使用无限生命期Session的方法
Oct 09 PHP
PHP中动态HTML的输出技术
Oct 09 PHP
PHP和XSS跨站攻击的防范
Apr 17 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
PHP中的integer类型使用分析
Jul 27 PHP
php 操作调试的方法
Jul 12 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
关于php支持的协议与封装协议总结(推荐)
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
Array of country list in PHP with Zend Framework
2011/10/17 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
来自qq的javascript面试题
2010/07/24 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
python对html代码进行escape编码的方法
2015/05/04 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python实现彩色图转换成灰度图
2019/01/15 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
Python求凸包及多边形面积教程
2020/04/12 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
授权委托书样本
2014/04/03 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
支部书记四风对照材料
2014/08/28 职场文书
2015个人半年总结范文
2015/03/09 职场文书
高温慰问简报
2015/07/21 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python