ThinkPHP3.2 Behavior随记
来源:互联网 发布:淘宝供销 编辑:程序博客网 时间:2024/05/21 06:54
Behavior
行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为既可以独立调用,也可以绑定到某个标签(位)中进行侦听。
这些行为发生作用的位置称之为标签(位),也可以称之为钩子,当应用程序运行到这个标签的时候,就会被拦截下来,统一执行相关的行为,类似于AOP编程中的“切面”的概念,给某一个标签绑定相关行为就成了一种类AOP编程的思想。
除了系统内置标签之外,开发人员还可以在应用中添加自己的应用标签,在任何需要拦截的位置添加如下代码即可:
tag('my_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; use Think\Behavior; class TestBehavior extends Behavior { // 行为扩展的执行入口必须是run public function run(&$params){ if(C('TEST_PARAM')) { echo 'RUNTEST BEHAVIOR '.$params; } } }
3.2.1版本开始,行为类的定义无需继承Think\Behavior
类,所以,上面的定义可以简化为:
namespace Home\Behavior; class TestBehavior { // 行为扩展的执行入口必须是run public function run(&$params){ if(C('TEST_PARAM')) { echo 'RUNTEST BEHAVIOR '.$params; } } }
行为类必须定义执行入口方法run
,由于行为的调用机制影响,run方法不需要任何返回值,所有返回都通过引用返回。
run方法的参数只允许一个,但可以传入数组。
行为绑定
行为定义完成后,就需要绑定到某个标签位置才能生效,否则是不会执行的。我们需要在应用的行为定义文件tags.php
文件中进行行为和标签的位置定义,格式如下:
return array( '标签名称1'=>array('行为名1','行为名2',...), '标签名称2'=>array('行为名1','行为名2',...), );
标签名称包括系统标签和应用中自己定义的标签名称,比如你需要在my_tag标签位置定义一个CheckLangBehavior行为类的话,可以使用:
return array( 'my_tag'=>array('Home\Behavior\CheckLang'), // **如果是3.2.1版本 需要改成(后面不再重复说明)** // 'app_init'=>array('Home\Behavior\CheckLangBehavior'), );可以给一个标签位定义多个行为,行为的执行顺序就是定义的先后顺序,例如:
return array( 'my_tag'=>array( 'Home\Behavior\CheckLang', 'Home\Behavior\CronRun' ), );默认情况下tags.php中定义的行为会并入系统行为一起执行,(除非中间某个行为有中止执行的操作)。
如果希望应用的行为配置文件中的定义覆盖系统的行为定义,可以改为为如下方式:
'app_begin' => array( 'Home\Behavior\CheckModule', 'Home\Behavior\CheckLang', '_overlay' => true, ),
应用行为的定义没有限制,你可以把一个行为绑定到多个标签位置执行,例如
return array( 'app_begin'=>array('Home\Behavior\Test'), // 在app_begin 标签位添加Test行为 'app_end'=>array('Home\Behavior\Test'), // 在app_end 标签位添加Test行为 );
单独执行
行为的调用不一定要放到标签才能调用,如果需要的话,我们可以在控制器中或者其他地方直接调用行为。例如,我们可以把用户权限检测封装成一个行为类,例如:
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');
- ThinkPHP3.2 Behavior随记
- ThinkPHP3.2 URL随记
- ThinkPHP3.2 验证随记
- ThinkPHP3.2 命名空间随记
- 【thinkphp3.x】ThinkPHP/Lib/Behavior/ParseTemplateBehavior.class.php文件分析
- 【thinkphp3.x】ThinkPHP/Lib/Behavior/ContentReplaceBehavior.class.php文件分析
- ThinkPHP3.1 行为扩展Behavior,tags标签位
- 2behavior原理解析
- Material之Behavior(2)
- behavior
- BEHAVIOR
- Behavior
- Behavior
- thinkphp3.2自定义常量
- thinkphp3.2学习记录
- ThinkPHP3.2导出excel
- Thinkphp3.2 表单令牌
- ThinkPHP3.2 分页
- Bootstrap 学习之(三) ------ 表格和按钮
- Red5流服务器搭建(实现在线直播,流媒体视频播放和在线视频会议)
- Qt为rpath增加$ORIGING
- Openstack Fuel 9.0安装后网卡设置
- ipcs 查询进程间通信状态
- ThinkPHP3.2 Behavior随记
- 299. Bulls and Cows
- 2016 年 10月
- jQuery选择器大全
- Jquery Md5加密-Jquery.md5.js
- poj - 2406 Power Strings 【KMP】
- python:open/文件操作
- 第21节--python的GUI编程
- SAP QM数据库表清单