ThinkPHP源码阅读3------行为扩展-阿里云开发者社区

开发者社区> 余二五> 正文

ThinkPHP源码阅读3------行为扩展

简介:
+关注继续查看

  ThinkPHP的核心采用的框架模式是CBD,也就是核心Core+行为Behavior+驱动Driver,核心也就是整个框架模式的核心,大部分都是一些基类,去规定规则,Behavior是行为,就是在指定的地方调用来完成一些特定的行为功能,而Driver驱动就类似cache缓存驱动,mysqldb 数据库驱动等,完成功能

  行为在手册的13.1中说的很详细.我只去写一些实例.调用行为的方法.

  调用方法是tags()


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * 处理标签扩展
 * @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;
    }
}


tag调用的时候,可以指定覆盖系统行为.之后会调用B函数去实例化行为对象.

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
26
/**
 * 执行某个行为
 *
 * @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' );
    }
}


B函数可以实例化行为对象,并且传入行为需要的参数.行为需要的参数可以在配置文件config.php中更改.并且会覆盖行为中的默认参数.

行为的基类在Lib/Conf/Behavior.class.php中

protected $options =  array(); 保存行为的参数

__construct    初始化类,参数赋值.   主要就是赋值,如果在config.php中存在的话,就用config.php中得覆盖.

__get          获取参数     获取行为参数

run             行为唯一执行入口

在B函数中,也可以手动指定参数执行入口,方法是B('类名/方法名')的方式

默认的行为有:

CheckRoute 检测路由,路由匹配
ContentReplace 模板内容输出替换
ParseTemplate 模板解析
ReadHtmlCache 静态缓存读取
ShowPageTrace 页面Trace显示
ShowRuntime 运行时间显示
TokenBuild 表单令牌生成
WriteHtml 静态缓存写入

扩展行为有

AgentCheck 代理检测
BrowserCheck 浏览器检测,防刷新
CheckActionRoute 操作路由检测
CheckLang 语言检测,并且自动加载语言包
CronRun 自动任务
FireShowPageTrace 将Trace输出到firefox的firebug
RobotCheck 机器人检测(就是检测百度蜘蛛等)
Upgrade 自动升级提示行为


现在写一个例子,大家就可以理解了.

在App.class.php中,App::run的方法里,有一个调用应用初始化标签的地方.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
     * 运行应用实例 入口文件使用的快捷方法
     * @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 ;
    }

现在在项目/Lib/Behavior里新建一个AppinitBehavior.class.php

1
2
3
4
5
6
<?php
class AppinitBehavior extends Behavior{
    function run(&$param){
        echo '应用开始了';
    }
}


然后在项目/Conf/tags.php里

1
2
3
4
5
6
<?php
return array(
    'app_init'=>array(
        'Appinit'
    )
);


       这样,在运行项目的时候,则会都输出应用开始了.非常方便.如果要修改,扩展,都直接修改类或者扩展类即可,不需要修改源代码,扩展性非常好.










本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1413619,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9497 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12037 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9055 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13186 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4621 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4012 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载