当前位置:K88软件开发文章中心网站服务器框架ThinkPHP → 文章内容

CBD模式

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:31:51

mlCache读取静态缓存行为app_initWriteHtmlCache生成静态缓存行为view_filter行为定义自定义的扩展行为可以放在核心或者应用目录,只要遵循命名空间的定义规则即可。 行为类的命名采用:行为名称(驼峰法,首字母大写)+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',...), );标签名称包括我们前面列出的系统标签和应用中自己定义的标签名称,比如你需要在app_init标签位置定义一个CheckLangBehavior行为类的话,可以使用:return array( 'app_init'=>array('Home\Behavior\CheckLangBehavior'),);可以给一个标签位定义多个行为,行为的执行顺序就是定义的先后顺序,例如:return array( 'app_init'=>array( 'Home\Behavior\CheckLangBehavior', 'Home\Behavior\CronRunBehavior' ),);默认情况下tags.php中定义的行为会并入系统行为一起执行,也就是说如果系统的行为定义中app_init标签中已经定义了其他行为,则会首先执行系统行为扩展中定义的行为,然后再执行项目行为中定义的行为。例如: 系统行为定义文件中定义了:'app_begin' => array( 'Behavior\ReadHtmlCacheBehavior', // 读取静态缓存),而应用行为定义文件有定义:'app_begin' => array( 'Home\Behavior\CheckModuleBehavior', 'Home\Behavior\CheckLangBehavior',),则最终执行到app_begin标签(位)的时候,会依次执行:Library\Behavior\ReadHtmlCacheBehaviorHome\Behavior\CheckModuleBehaviorHome\Behavior\CheckLangBehavior三个行为(除非中间某个行为有中止执行的操作)。如果希望应用的行为配置文件中的定义覆盖系统的行为定义,可以改为为如下方式:'app_begin' => array( 'Home\Behavior\CheckModuleBehavior', 'Home\Behavior\CheckLangBehavior', '_overlay' => true,),则最终执行到app_begin标签(位)的时候,会依次执行下面两个行为:Home\Behavior\CheckModuleBehaviorHome\Behavior\CheckLangBehavior应用行为的定义没有限制,你可以把一个行为绑定到多个标签位置执行,例如:return array( 'app_begin'=>array('Home\Behavior\TestBehavior'), // 在app_begin 标签位添加Test行为 'app_end'=>array('Home\Behavior\TestBehavior'), // 在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');

上一页  [1] [2] 


CBD模式