ThinkPHP行为扩展Behavior应用实例详解
2023-06-13 09:15:39 时间
本文以实例的形式详细介绍了ThinkPHP的行为扩展Behavior的实现方法,有助于读者更灵活的掌握ThinkPHP的开发,具体步骤如下:
ThinkPHP行为扩展(Behavior)流程:
最先是读取配置文件信息:
$mode=includeis_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(includeCONF_PATH."tags.php");
分别用Hook去加载系统行为和自定义行为,并把配置信息保存到Hook私有属性$tags中
ThinkPHP\Library\Think\Think.class.php初始化完成后会调用App::run();
ThinkPHP\Library\Think\App.class.php文件如下:
/** *运行应用实例入口文件使用的快捷方法 *@accesspublic *@returnvoid */ staticpublicfunctionrun(){ //应用初始化标签 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; }
可以看出程序
所有钩子如下:
"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给项目经理等。
相关文章
- 香农编码的matlab实现总结_matlab简单代码实例
- jquery动画效果实例_动画js
- 数据仓库常见建模方法与建模实例演示[通俗易懂]
- 【错误记录】Groovy 扩展方法调用报错 ( 静态扩展方法 或 实例扩展方法 需要分别配置 | 没有配置调用会报错 groovy.lang.MissingMethodException )
- MySQL MGR:管理多个MySQL实例的可扩展解决方案(mgrmysql)
- Oracle 详解添加实例步骤,快速扩展数据库性能(oracle添加实例)
- 一键接入多实例Redis让项目扩展更便捷(一个项目接多个redis)
- android简单图片动画播放的实例代码
- 仿网易新闻客户端头条ViewPager嵌套实例
- Jquery中给animation加更多的运作效果实例
- php引用传值实例详解学习
- java基于包结构的请求路由实现实例分享
- Android入门之LinearLayout、AbsoluteLayout的用法实例讲解
- C语言实现单链表逆序与逆序输出实例
- Ruby使用C++扩展实例(含C++扩展代码示例)