ThinkPHP源码阅读3------行为扩展
2020-12-13 05:41
标签:thinkphp行为 行为扩展 ThinkPHP的核心采用的框架模式是CBD,也就是核心Core+行为Behavior+驱动Driver,核心也就是整个框架模式的核心,大部分都是一些基类,去规定规则,Behavior是行为,就是在指定的地方调用来完成一些特定的行为功能,而Driver驱动就类似cache缓存驱动,mysqldb 数据库驱动等,完成功能 行为在手册的13.1中说的很详细.我只去写一些实例.调用行为的方法. 调用方法是tags() tag调用的时候,可以指定覆盖系统行为.之后会调用B函数去实例化行为对象. B函数可以实例化行为对象,并且传入行为需要的参数.行为需要的参数可以在配置文件config.php中更改.并且会覆盖行为中的默认参数. 行为的基类在Lib/Conf/Behavior.class.php中 protected $options = array(); 保存行为的参数 __construct 初始化类,参数赋值. 主要就是赋值,如果在config.php中存在的话,就用config.php中得覆盖. __get 获取参数 获取行为参数 run 行为唯一执行入口 在B函数中,也可以手动指定参数执行入口,方法是B(‘类名/方法名‘)的方式 默认的行为有: 扩展行为有 现在写一个例子,大家就可以理解了. 在App.class.php中,App::run的方法里,有一个调用应用初始化标签的地方. 现在在项目/Lib/Behavior里新建一个AppinitBehavior.class.php 然后在项目/Conf/tags.php里 这样,在运行项目的时候,则会都输出应用开始了.非常方便.如果要修改,扩展,都直接修改类或者扩展类即可,不需要修改源代码,扩展性非常好. 个人QQ:2387813033,(尛雷) QQ群:252799167 本文出自 “尛雷” 博客,请务必保留此出处http://a3147972.blog.51cto.com/2366547/1413619 ThinkPHP源码阅读3------行为扩展,搜素材,soscw.com ThinkPHP源码阅读3------行为扩展 标签:thinkphp行为 行为扩展 原文地址:http://a3147972.blog.51cto.com/2366547/1413619/**
* 处理标签扩展
* @param string $tag
* 标签名称
* @param mixed $params
* 传入参数
* @return mixed
*/
function tag($tag, &$params = NULL) {
// 系统标签扩展
$extends = C ( ‘extends.‘ . $tag );
// 应用标签扩展
$tags = C ( ‘tags.‘ . $tag );
if (! empty ( $tags )) {
if (empty ( $tags [‘_overlay‘] ) && ! empty ( $extends )) { // 合并扩展
//array_unique 移除数组中重复的值
$tags = array_unique ( array_merge ( $extends, $tags ) );
} elseif (isset ( $tags [‘_overlay‘] )) { // 通过设置 ‘_overlay‘=>1 覆盖系统标签
unset ( $tags [‘_overlay‘] );
}
} elseif (! empty ( $extends )) {
$tags = $extends;
}
if ($tags) {
if (APP_DEBUG) {
G ( $tag . ‘Start‘ );
trace ( ‘[ ‘ . $tag . ‘ ] --START--‘, ‘‘, ‘INFO‘ );
}
// 执行扩展
foreach ( $tags as $key => $name ) {
if (! is_int ( $key )) { // 指定行为类的完整路径 用于模式扩展
$name = $key;
}
B ( $name, $params );
}
if (APP_DEBUG) { // 记录行为的执行日志
trace ( ‘[ ‘ . $tag . ‘ ] --END-- [ RunTime:‘ . G ( $tag . ‘Start‘, $tag . ‘End‘, 6 ) . ‘s ]‘, ‘‘, ‘INFO‘ );
}
} else { // 未执行任何行为 返回false
return false;
}
}
/**
* 执行某个行为
*
* @param string $name
* 行为名称
* @param Mixed $params
* 传入的参数
* @return void
*/
function B($name, &$params = NULL) {
if (strpos ( $name, ‘/‘ )) {
list ( $name, $method ) = explode ( ‘/‘, $name );
} else {
$method = ‘run‘;
}
$class = $name . ‘Behavior‘;
if (APP_DEBUG) {
G ( ‘behaviorStart‘ );
}
$behavior = new $class ();
$behavior->$method ( $params );
if (APP_DEBUG) { // 记录行为的执行日志
G ( ‘behaviorEnd‘ );
trace ( $name . ‘ Behavior ::‘ . $method . ‘ [ RunTime:‘ . G ( ‘behaviorStart‘, ‘behaviorEnd‘, 6 ) . ‘s ]‘, ‘‘, ‘INFO‘ );
}
}
CheckRoute
检测路由,路由匹配
ContentReplace
模板内容输出替换
ParseTemplate
模板解析
ReadHtmlCache
静态缓存读取
ShowPageTrace
页面Trace显示
ShowRuntime
运行时间显示
TokenBuild
表单令牌生成
WriteHtml
静态缓存写入
AgentCheck
代理检测
BrowserCheck
浏览器检测,防刷新
CheckActionRoute
操作路由检测
CheckLang
语言检测,并且自动加载语言包
CronRun
自动任务
FireShowPageTrace
将Trace输出到firefox的firebug
RobotCheck
机器人检测(就是检测百度蜘蛛等)
Upgrade
自动升级提示行为
/**
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
*/
static public function run() {
// 项目初始化标签
tag(‘app_init‘);
App::init();
// 项目开始标签
tag(‘app_begin‘);
// Session初始化
session(C(‘SESSION_OPTIONS‘));
// 记录应用初始化时间
G(‘initTime‘);
App::exec();
// 项目结束标签
tag(‘app_end‘);
return ;
}
array(
‘Appinit‘
)
);