在网上很少看到关于thinkphp行为扩展的文章,亦或是相互抄袭,千篇一律,或者是新手很难看懂。最近一个朋友问到我这个问题,现在总结下关于thinkphp的行为扩展,下面是基于thinkphp3.13,以后在看看最新的3.2的行为扩展方面的变化。
下面是官方手册的一段介绍:
行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。
别人帖子中的一些介绍:
行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为既可以独立调用,也可以绑定到某个标签中进行侦听,官方提出的CBD模式中行为也占了主要的地位,可见行为在ThinkPHP框架中意义非凡。
这里指的行为是一个比较抽象的概念,你可以想象成在应用执行过程中的一个动作或者处理,在框架的执行流程中,各个位置都可以有行为产生,例如路由检测是一个行为,静态缓存是一个行为,用户权限检测也是行为,大到业务逻辑,小到浏览器检测、多语言检测等等都可以当做是一个行为,甚至说你希望给你的网站用户的第一次访问弹出Hello,world!这些都可以看成是一种行为,行为的存在让你无需改动框架和应用,而在外围通过扩展或者配置来改变或者增加一些功能。
而不同的行为之间也具有位置共同性,比如,有些行为的作用位置都是在应用执行前,有些行为都是在模板输出之后,我们把这些行为发生作用的位置称之为标签(位),当应用程序运行到这个标签的时候,就会被拦截下来,统一执行相关的行为,类似于AOP编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。
是不是看起来有点云里雾里的,介绍的非常专业,高大上的感觉。其实就是一句话:
在代码逻辑部分的某个地方去执行一个函数(方法)
在tp3.1的基础上来创建一个项目,简单的配置下入口文件
define(‘APP_DEBUG’,True);
define(‘APP_PATH’,’./Application/’);
require ‘./ThinkPHP/ThinkPHP.php’;
访问之后会自动创建一个项目所需的基本目录结构。
看手则可以知道,如果想给项目添加一个行为,那么要把这个行为文件放到项目的Lib/Behavior 目录下,并且扩展的行为类需要继承自behavior抽象类 ,下面在Lib/Behavior中写一个testBehavior.class.php行为 ,那到底怎么写这个子类了,我个人的习惯,先看手册介绍,再看源码。
现在看看behavior抽象类写了什么。找到thinkphp 框架下的thinkphp/Lib/Core/Behavior.class.php
打开之后可以看到里面写这一个抽象类,并且有一个开放的run抽象方法,因此凡是继承自behavior的子类必须有该方法。仔细看里面的另外两个方法一个是构造函数,一个是_get魔术方法,从构造函数中可以看到,如果option元素有值的话会被转化为全局的变量;
class TestBehavior extends Behavior {
// 行为参数定义
protected $options = array(
‘name’=>’zhangsan’
);
// 行为扩展的执行入口必须是run
public function run(&$params){
if(C(‘name’)==’zhangsan’){
echo ‘i am zhangsan’;
}else{
echo ‘i not zhangsan’ ;
}
}
}
刷新下网页貌似什么都没有发生。
继续看手册说明,原来还要调用,那我们就按照它的要求去调用。
thinkphp中提供了三种调用方式,分别是:
1.添加到行为配置文件
2.函数方式动态定义
3.不放入标签直接执行
先试试第一种调用方式(添加到行为配置文件)
首先在项目的config目录下建立一个tags.php文件,按照要求是这样写(别问为什么要这样写,这是规定,如果非要知道,可以看看common/runtime.php):
<?php
return array(
‘标签位置’=>array(‘行为名称’,’_overlay是否覆盖系统行为’
)
)
?>
手册中说,除了thinkphp内置的几个标签位置之外,也可以自己定义一个标签位置。
先用系统提供的内置标签位试试。
在tags.php中写入:
‘app_end’=>array(‘Test’),
刷新网页看看是不是输出了 i am zhangsan
下面我们自定义一个标签位 haha ,把刚刚tags.php中的app_end 修改成 haha . 刷新下网页,没有输出上面的图片
然后我们在index 控制器的index方法中添加 tag(‘haha’);刷新网页 又出现了上面的i am zhangsan.
注意:tag函数用于设置某个标签位,可以传入并且只接受一个参数,如果需要传入多个参数,请使用数组,该参数为引用传值,所以只能传入变量。
如果实在不理解这句话,直接去 thinkphp框架中的common/common.php中查看tag函数。这里就不在说了。
我们把tag(‘haha’) 修改成
然后在testBehavior的run 方法中输出下 param参数,结果是:
其次说下第二种调用行为的方法(函数方式动态定义)
add_tag_behavior(’app_end’,’Test’); 把test行为添加到app_end标签位上。
最后是 不放入标签直接执行
通过B函数 如 B(‘Test’)
如果想深入了解行为 建议看下这几个函数 分别是 B函数 tag函数 add_tag_behavior函数 可以更加明白行为的调用过程。
未经允许不得转载:开心乐窝-乐在其中 » thinkphp行为扩展