ThinkPHP的CBD模式

thinkphp使用核心c(core)+行为b(behavior)+驱动d(driver)三种方式架构。

Core(核心)

ThinkPHP的核心部分包括核心函数库、惯例配置、核心类库(包括基础类和内置驱动及核心行为)

Driver(驱动)

//包含以下文件
ThinkPHP/Library/Think/Cache/Driver // 缓存驱动类库
ThinkPHP/Library/Think/Db/Driver // 数据库驱动类库
ThinkPHP/Library/Think/Log/Driver // 日志记录驱动类库
ThinkPHP/Library/Think/Session/Driver // Session驱动类库
ThinkPHP/Library/Think/Storage/Driver // 存储驱动类库
ThinkPHP/Library/Think/Template/Driver // 第三方模板引擎驱动类库
ThinkPHP/Library/Think/Template/TagLib // 内置模板引擎标签库扩展类库
Behavior(行为)

什么是行为,行为是应用的执行过程中的一个动作一个处理。有些行为具有位置共性。
行为发生的位置可以称为标签或钩子。

系统核心的一些标签

app_init 应用初始化标签位
module_check 模块检测标签位(**3.2.1版本新增**)
path_info PATH_INFO检测标签位
app_begin 应用开始标签位
action_name 操作方法名标签位
action_begin 控制器开始标签位
view_begin 视图输出开始标签位
view_template 视图模板解析标签位
view_parse 视图解析标签位
template_filter 模板解析过滤标签位
view_filter 视图输出过滤标签位
view_end 视图输出结束标签位
action_end 控制器结束标签位
app_end 应用结束标签位

自定义标签

// 添加my_tag 标签侦听
tag('my_tag'); 
// 下面的写法作用一致
ThinkHook::listen('my_tag');

tag函数用于设置某个标签位,可以传入并且只接受一个参数,如果需要传入多个参数,请使用数组,

tag('my_tag',$params); // 添加my_tag 标签侦听

该参数为引用传值,所以只能传入变量,因此下面的传值是错误的:

tag('my_tag','param'); // 添加my_tag 标签侦听行为的定义

行为定义
自定义的扩展行为可以放在核心或者应用目录,只要遵循命名空间的定义规则即可。
行为类的命名采用:行为名称(驼峰法,首字母大写)+Behavior 行为类的定义方式如下:

namespace HomeBehavior;
//**3.2.1版本**开始,行为类的定义无需继承ThinkBehavior类
use ThinkBehavior; 
//**3.2.1版本**开始,行为类的定义无需继承ThinkBehavior类
class TestBehavior extends Behavior {
 //行为扩展的执行入口必须是run
//run方法的参数只允许一个,但可以传入数组。
 public function run(&$params){
 if(C('TEST_PARAM')) {
     echo 'RUNTEST BEHAVIOR '.$params;}
 }
}

行为绑定

行为定义完成后,就需要绑定到某个标签位置才能生效,否则是不会执行的。
我们需要在应用的行为定义文件tags.php
文件中进行行为和标签的位置定义,格式如下:

return array(
 '标签名称1'=>array('行为名1','行为名2',...), 
 '标签名称2'=>array('行为名1','行为名2',...), 
 );

单独执行

行为的调用不一定要放到标签才能调用,如果需要的话,我们可以在控制器中或者其他地方直接调用行为。例如,我们可以把用户权限检测封装成一个行为类,例如:

namespace HomeBehavior;
use ThinkBehavior;
class AuthCheckBehavior extends Behavior {
 // 行为扩展的执行入口必须是run
 public function run(&$return){
 if(C('USER_AUTH_ON')) {
 // 进行权限认证逻辑 如果认证通过 $return = true;
 // 否则用halt输出错误信息
 }
 }
}

定义了AuthCheck行为后,我们可以在控制器的_initialize方法中直接用下面的方式调用:

B('HomeBehaviorAuthCheck');

发表评论

电子邮件地址不会被公开。 必填项已用*标注