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 相关文章推荐
BBS(php & mysql)完整版(二)
Oct 09 PHP
php学习之 数组声明
Jun 09 PHP
PHP运行模式的深入理解
Jun 03 PHP
PHP调用VC编写的COM组件实例
Mar 29 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
PHP中Trait及其应用详解
Feb 14 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 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操作xml代码
2010/06/17 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
微信支付扫码支付php版
2016/07/22 PHP
取得传值的函数
2006/10/27 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
Python三级菜单的实例
2017/09/13 Python
Python虚拟环境项目实例
2017/11/20 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
python生成特定分布数的实例
2019/12/05 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
pycharm实现猜数游戏
2020/12/07 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
关于环保的建议书400字
2014/03/12 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
党员个人自我评价
2015/03/03 职场文书
项目合作意向书
2015/05/08 职场文书
婚宴新郎致辞
2015/07/28 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python