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 和 MySQL 基础教程(二)
Oct 09 PHP
cmd下运行php脚本
Nov 25 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
Nov 12 PHP
php 多线程上下文中安全写文件实现代码
Dec 28 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
浅谈php提交form表单
Jul 01 PHP
学习PHP Cookie处理函数
Aug 09 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 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
数据库相关问题
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
js 提交和设置表单的值
2008/12/19 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
webpack配置sass模块的加载的方法
2017/07/30 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
Django视图类型总结
2021/02/17 Python
什么是SCM(软件配置管理)
2014/08/16 面试题
创建文明城市倡议书
2015/04/28 职场文书
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python