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');
// 下面的写法作用一致
\Think\Hook::listen('my_tag');
tag函数用于设置某个标签位,可以传入并且只接受一个参数,如果需要传入多个参数,请使用数组,
tag('my_tag',$params); // 添加my_tag 标签侦听
该参数为引用传值,所以只能传入变量,因此下面的传值是错误的:
tag('my_tag','param'); // 添加my_tag 标签侦听
行为的定义
行为定义
自定义的扩展行为可以放在核心或者应用目录,只要遵循命名空间的定义规则即可。
**行为类的命名采用:行为名称(驼峰法,首字母大写)+Behavior **行为类的定义方式如下:
namespace Home\Behavior;
//**3.2.1版本**开始,行为类的定义无需继承Think\Behavior类
use Think\Behavior;
//**3.2.1版本**开始,行为类的定义无需继承Think\Behavior类
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 Home\Behavior;
use Think\Behavior;
class AuthCheckBehavior extends Behavior {
// 行为扩展的执行入口必须是run
public function run(&$return){
if(C('USER_AUTH_ON')) {
// 进行权限认证逻辑 如果认证通过 $return = true;
// 否则用halt输出错误信息
}
}
}
定义了AuthCheck行为后,我们可以在控制器的_initialize方法中直接用下面的方式调用:
B('Home\Behavior\AuthCheck');