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');