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,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
开发框架 前端开发 搜索推荐
分享97个框架模板PHP源码,总有一款适合你
分享97个框架模板PHP源码,总有一款适合你
57 2
|
11月前
|
Ubuntu Linux 开发工具
嵌入式Linux开发环境搭建之四----Vim的安装
嵌入式Linux开发环境搭建之四----Vim的安装
71 0
|
XML 开发框架 JavaScript
【web 开发基础】php 开发基础快速入门 (3)-PHP程序符号标记和程序注释的使用及空白符详解
以<?php开始和以 ?>结束的标记是标准风格的标记,属于xml风格,这也是PHP推荐使用的标记形式,服务器管理员不能禁用这种风格的标记,如果将PHP嵌入到XML或者XHTML中,则需要使用<?php?>以保证符合标准,如果没有特殊要求,在开发过程中一般默认使用此风格. 以<script language="php">开始和以</script>结束是长风格标记,这种标记是最长的,这种用法就是javascript和vbscript等脚本语言的写法,如果你使用的html编辑器无法使用其他风格的标记可以使用这个标记来界定PHP代码,不过这在日常开发中是比较少用的. 以<?开始和以?>结束的标记是最简
232 1
|
关系型数据库 MySQL 数据库
DataGrip 2020版-------入门教程
建立新的数据源连接new->datasource->mysql 我的本地是mysql,就以mysql为例
270 0
DataGrip 2020版-------入门教程
|
安全 Java Linux
【PHP快速入门】详细笔记---精简版(上)
【PHP快速入门】详细笔记---精简版
99 0
【PHP快速入门】详细笔记---精简版(上)
|
Web App开发 安全 Shell
【PHP快速入门】详细笔记---精简版(下)
【PHP快速入门】详细笔记---精简版
106 0
【PHP快速入门】详细笔记---精简版(下)
|
PHP
ThinkPHP源码阅读最佳工具debug_backtrace(1)
ThinkPHP源码阅读最佳工具debug_backtrace
146 0
ThinkPHP源码阅读最佳工具debug_backtrace(1)
|
C# C++ Windows
Wix 安装部署教程(十五) --CustomAction的七种用法
原文:Wix 安装部署教程(十五) --CustomAction的七种用法       在WIX中,CustomAction用来在安装过程中执行自定义行为。比如注册、修改文件、触发其他可执行文件等。这一节主要是介绍一下CustomAction的7种用法。
1929 0
|
自然语言处理 测试技术
Wix 安装部署教程(十六) -- 自动生成多语言文件
原文:Wix 安装部署教程(十六) -- 自动生成多语言文件      因为持续集成需要,所有项目编译完之后生成一个多语言的安装包。之前生成mst文件都是手动操作,而且mst文件必须每次重新和新的安装包“关联”,否则中文的安装包去调用英文的资源的时候就会报类似于“类型转换失败”的错误。
1248 0
|
XML 移动开发 数据格式
Wix 安装部署教程(十一) ---QuickWix
原文:Wix 安装部署教程(十一) ---QuickWix       这次发布的是这两天做的一个WIX工具QuickWIX,主要解决两个问题点1.对大文件快速生成wix标签(files,Directories,ComponentRef);2.比较前后两次工程的差异。
1451 0