本文以实例的形式详细介绍了ThinkPHP的行为扩展Behavior的实现方法,有助于读者更灵活的掌握ThinkPHP的开发,具体步骤如下:
ThinkPHP 行为扩展 (Behavior) 流程:
最先是读取配置文件信息:
1 | $mode = include is_file (CONF_PATH. 'core.php' )?CONF_PATH. 'core.php' :MODE_PATH.APP_MODE. '.php' ;
|
Salin selepas log masuk
读取配置文件信息 ThinkPHP\Mode\common.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 'tags' => array (
'app_init' => array (
),
'app_begin' => array (
'Behavior\ReadHtmlCache' ,
),
'app_end' => array (
'Behavior\ShowPageTrace' ,
),
'path_info' => array (),
'action_begin' => array (),
'action_end' => array (),
'view_begin' => array (),
'view_parse' => array (
'Behavior\ParseTemplate' ,
),
'template_filter' => array (
'Behavior\ContentReplace' ,
),
'view_filter' => array (
'Behavior\WriteHtmlCache' ,
),
'view_end' => array (),
),
|
Salin selepas log masuk
默认调用了系统行为扩展:静态缓存读取 、页面Trace显示输出、模板解析、模板内容输出替换、静态缓存写入
1 2 3 4 5 6 7 8 9 | 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' );
|
Salin selepas log masuk
分别用Hook去加载 系统行为和自定义行为,并把配置信息保存到 Hook 私有属性$tags中
ThinkPHP\Library\Think\Think.class.php 初始化完成后会调用App::run();
ThinkPHP\Library\Think\App.class.php文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | static public function run() {
Hook::listen( 'app_init' );
App::init();
Hook::listen( 'app_begin' );
if (!IS_CLI){
session(C( 'SESSION_OPTIONS' ));
}
G( 'initTime' );
App:: exec ();
Hook::listen( 'app_end' );
return ;
}
|
Salin selepas log masuk
可以看出程序在App init之前 通过钩子去监听(查看)此动作时是否有需要处理的。循环$tags['app_init']获取类名并通过类名自动执行行为扩展类run方法
所有钩子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 'url_dispatch'
'app_init'
'app_begin'
'app_end'
'action_begin'
'action_end'
'ajax_return'
'path_info'
'template_filter'
'view_begin'
'view_end'
'view_parse'
'view_filter'
|
Salin selepas log masuk
缺点如下:
1.顺序不可控(配置文件没有专门的参数去控制顺序)如app_init同时有2个监控时先调用哪个方法。
2.监控不是全局监控内部写的太死只有一些定义好的不能通过配置文件去自动控制每一个操作的钩子(可能是考虑到性能才没有加)
优点如下:
1.可以实现了好多行为扩展
2.可以代理检测、浏览器防刷新检测、操作路由检测等
总结:
行为扩展就是在 程序某个操作时去额外的去执行某一特定功能。如程序在操作数据库 读的时候 通过explian获取性能信息并监测性能瓶颈 如出现获取数据时超过特定秒数 就把相关信息email给项目经理等。