ThinkPHP行为扩展
一、系统内置标签和用户自定义应用标签
在ThinkPHP V3.1.2中设置了很多标签扩展位,每个标签位置可以依次执行各自的独立行为。
在每个标签位置,可以配置多个行为定义,行为的执行顺序按照定义的顺序依次执行。除非前面的行为里面中断执行了(某些行为可能需要中断执行,例如检测机器人或者非法执行行为),否则会继续下一个行为的执行。
系统核心提供的标签位置包括下面几个(按照执行顺序排列):
app_init | 应用初始化标签位 |
path_info | PATH_INFO检测标签位 |
route_check | 路由检测标签位 |
app_begin | 应用开始标签位 |
action_name | 操作方法名标签位 |
action_begin | 控制器开始标签位 |
view_begin | 视图输出开始标签位 |
view_template | 视图模板解析标签位 |
view_parse | 视图解析标签位 |
view_filter | 视图输出过滤标签位 |
view_end | 视图输出结束标签位 |
action_end | 控制器结束标签位 |
app_end | 应用结束标签位 |
除了上述的系统内置标签(也可以称为系统核心标签)外,还可以在应用中添加自己的应用标签(这里的应用标签对应的类就称为行为扩展)如:
Class CommonAction extends Action{ Public function _initialize(){ tag('action_init'); // 添加action_init 标签 } }
二、系统内置行为和自定义行为扩展
系统为我们提供了如下内置行为:
行为名称 | 说明 | 对应标签位置 |
---|---|---|
checkRoute | 路由检测行为,完成内置的路由功能 | route_check |
LocationTemplate | 模板定位行为,完成模板文件自动定位和输出规则 | view_template |
ParseTemplate | 模板文件解析,并支持第三方模板引擎驱动 | view_parse |
ShowPageTrace | 页面Trace功能行为,完成页面Trace功能 | view_end |
ShowRuntime | 运行时间显示行为,完成运行时间显示 | view_filter |
TokenBuild | 令牌生成行为,完成表单令牌的自动生成 | view_filter |
ReadHtmlCache | 读取静态缓存行为 | app_init |
WriteHtmlCache | 生成静态缓存行为 | view_filter |
我们也可以自定义一些应用行为扩展,如下我们就定义了应用行为扩展Test:
class TestBehavior extends Behavior { // 行为参数定义 protected $options = array( 'TEST_PARAM' => false, // 行为参数 会转换成TEST_PARAM配置参数 ); // 行为扩展的执行入口必须是run public function run(&$params){ if(C('TEST_PARAM')) { echo 'RUNTEST BEHAVIOR '.$params; } } }
三、行为的调用
1.添加到行为配置文件
添加到行为配置文件(在项目配置目录中添加tags.php文件,并加如下代码:)
return array( 'app_end'=>array('Test'), // 在app_end 标签位添加Test行为 );
注:除了将行为扩展加入到系统内置标签位,也可以将它添加到自定义标签位,如把Test行为添加到自定义应用标签。如下:
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), );
2.函数方式动态定义
除了定义项目配置目录中的tags.php行为配置文件之外,系统还提供了动态添加行为到标签位的方法,例如我们可以使用下面的方式添加Test行为到app_end标签位,而无需在项目配置目录中的tags.php文件中添加定义:
add_tag_behavior('app_end','Test');
3.不放入标签直接执行
有时候,行为的调用不一定要放到标签才能调用,如果需要的话,我们可以在控制器中直接调用行为。例如,我们可以把用户权限检测封装成一个行为类,例如:
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输出错误信息 return $return = "sb"; } } }
定义了AuthCheck行为后,然后在_initialize方法中直接用下面的方式调用:
<?php class IndexAction extends Action{ public function index($name='ThinkPHP') { //$this->hello = 'Hello,'.$name.'!'; $return = ""; C('USER_AUTH_ON ',TRUE); B('AuthCheck',$return); echo $return; } }
PS:官方提供的手册中说明的第二种调用方式(函数方式动态定义),其实官网手册并没有说详细,用这种方式只能动态添加到系统内置标签位并不能添加到自定义标签位。因为执行顺序有个先后的问题。
注:我们可以反过来用,但这个并不实用,怎么使用见仁见智了。如下:
先用add_tag_behavior动态添加标签位
<?php class IndexAction extends Action{ Public function _initialize(){ add_tag_behavior("action_init","Test"); } ?>
然后再用tag方法来调用
tag('action_init'); // 添加action_init 标签
以上纯属个人见解,如有不对请谅解。