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


0 0
原创粉丝点击