ThinkPHP3.0完全开发手册
定义了一个行为扩展之后,系统提供了三种方式可以调用行为:
一、添加到行为配置文件
为了执行Test行为,我们在这里把Test行为加入app_end 标签位置,在项目配置目录中添加tags.php文件,在其中添加下面代码:
return array(
'app_end'=>array('Test'), // 在app_end 标签位添加Test行为
);
tags文件是项目的行为定义文件,在这个文件中可以给每个标签位置添加项目自己的扩展行为,当然你也可以添加到应用自己的标签位,例如,我们可以把Test行为添加到前面项目自己定义的action_init标签位置:
return array(
'action_init'=>array('Test'), // 在action_init 标签位添加Test行为
);
应用行为的定义没有限制,你甚至可以把同一个行为放到多个标签位置执行多次,例如:
return array(
'app_begin'=>array('Test'), // 在app_begin 标签位添加Test行为
'app_end'=>array('Test'), // 在app_end 标签位添加Test行为
);
默认情况下应用行为扩展会并入系统行为扩展一起执行,也就是说如果系统的行为定义中app_end标签中已经定义了其他行为,会首先执行系统行为扩展,然后再执行应用行为扩展,如果你希望项目的行为扩展完全替换系统的行为扩展,可以使用:
return array(
'app_end'=>array('Test','_overlay'=>1),
);
表示app_end标签位用定义的应用行为完全替换该位置的系统行为,也就是说即使系统标签在app_end定义了其他的系统行为也不会被执行,但是必须注意,行为的命名不要和系统行为一样。
二、函数方式动态定义
除了定义tags行为配置文件之外,系统还提供了动态添加行为到标签位的方法,例如我们可以使用下面的方式添加Test行为到app_end标签位,而无需在tags文件中添加定义:
add_tag_behavior('app_end','Test');
表示把Test行为添加到app_end标签位的最后,你可以把这个代码放到项目的公共函数文件中甚至直接放到行为类的最后(如果你确定这个行为扩展只有你的项目会用到的话)。
应用行为扩展类除了放到项目类库的Behavior目录外, 还可以放到系统的行为扩展目录Extend/Behavior/,行为类在执行过程中会自动加载。
三、不放入标签直接执行
有时候,行为的调用不一定要放到标签才能调用,如果需要的话,我们可以在控制器中直接调用行为。例如,我们可以把用户权限检测封装成一个行为类,例如:
class AuthCheckBehavior extends Behavior {
// 行为参数定义
protected $options = array(
'USER_AUTH_ON' =>false, // 是否开启用户认证
'USER_AUTH_ID' =>'user_id', // 定义用户的id为权限认证字段
);
// 行为扩展的执行入口必须是run
public function run(&$return){
if(C('USER_AUTH_ON')) {
// 进行权限认证逻辑 如果认证通过 $return = true;
// 否则用halt输出错误信息
}
}
定义了AuthCheck行为后,然后在_initialize方法中直接用下面的方式调用:
B('AuthCheck');
注意:因为这种方式的行为调用需要在相关位置添加代码,所以一般只有在应用代码才直接使用B方法调用。