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(2)
Oct 09 PHP
多文件上传的例子
Oct 09 PHP
第六章 php目录与文件操作
Dec 30 PHP
php FLEA中二叉树数组的遍历输出
Sep 26 PHP
PHP远程采集图片详细教程
Jul 01 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
PHP中常用的输出函数总结
Sep 22 PHP
phalcon框架使用指南
Feb 23 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
PHP生成短网址的思路以及实现方法的详解
Mar 25 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中substr()与explode()函数用法分析
2014/11/24 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python中from module import * 的一个坑
2014/07/20 Python
浅析Python多线程下的变量问题
2015/04/28 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
python pygame实现五子棋小游戏
2020/10/26 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
python字符串的拼接方法总结
2019/11/18 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
基于Python实现简单学生管理系统
2020/07/24 Python
python实现学生通讯录管理系统
2021/02/25 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
万年牢教学反思
2014/02/15 职场文书
颁奖典礼主持词
2014/03/25 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
Python标准库之typing的用法(类型标注)
2021/06/02 Python