下面单说一下Thinkphp3.2.3中的插件的使用,查过太多的资料,而官网文档中描述又不很详细,现记录于此,供有需要的同学查阅。
Thinkphp3.2.3中的插件机制,多少和行为有很大的联系,说到行为,就不得不提标签位,框架自带了很多标签位,例如:
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 应用结束标签位
系统预留这么多标签位,允许开发者进行行为扩展,例如,我希望在app_init这个标签位放置一个行为,也就是在应用初始化的时候执行,你可以这么做
1.在/Application/Behaviors文件夹(没有自行创建)下创建一个名字叫 TestBehavior.class.php 的文件:
内容如下:
<?php
namespace Behaviors;
class TestBehavior extends \Think\Behavior {
function run(&$arg) {
echo "hello,behavior";
}
}
?>
行为定义中,run方法是必须的,也是唯一在行为发生时调用的方法。继承\Think\Behavior并非必须,但是官方建议,为的是实现父类中的抽象方法 function run(&$arg){}
2.在/Application/Common/Conf/tags.php里增加一条数组记录,如果没有该文件就创建一个,内容大概如下:
<?php
return array(
// 添加下面一行定义即可
'app_init' => array(
'Behaviors\TestBehavior', //行为测试程序
),
//这里可以继续添加其他的标签
);
?>
经过以上两步,你会发现,程序无论使用什么路由,顶部都会输出 hello,behavior
所以我对于行为的理解就是,预留一个位置,这个位置会在程序的执行过程中执行到,至于执行到这个位置,你希望有什么其他的操作,可以自由定义。
-------------我是分割线---------------
说完了行为,来说今天的主题,插件。为什么要在说插件之前先说行为呢,主要是因为等下,你会看到很有意思的地方,那就是标签位,变成了由你自由定义了,而其他的不变。
1.在/Application/Addons/下创建一个Test文件夹,下面再创建一个文件:
TestAddons.class.php (目录如果没有,自行创建)
内容大概如下:
<?php
namespace Addons\Test;
class TestAddons {
public function test($pa) {
echo 'hello world';
}
public function test1() {
echo "12";
}
public function test2() {
echo "44";
}
}
?>
方法名自由定义,没有拘束。
2.在/Application/Common/Conf/tags.php里增加一条数组记录,接上面的话,就是:
<?php
return array(
// 添加下面一行定义即可
'app_init' => array(
'Behaviors\TestBehavior', //行为测试程序
),
'test' => array('Addons\Test\TestAddons'),
'test1' => array('Addons\Test\TestAddons'),
//这里可以继续添加其他的标签
);
?>
这里就比较有意思了,刚才说了,类似app_init这种,属于系统内置的标签位,定义好行为,就能知道他在什么时候会被触发。
但是插件的话,居然可以自定义标签位,而这个标签位,我们统一称为HOOK(钩子),通过在tags终增加这么一条记录,等于自动注册了一个HOOK,那么以后在程序中,就可以自由调用了。
另外,这里的标签位,也就是HOOK的名字必须和刚才插件类中的方法名一样,如上,test,test1,test2这种,名字你可以随意定义。
3.第三步,在/Application/Common/function.php中增加一个方法如下:
/**
* 处理插件钩子
* @param string $hook 钩子名称
* @param mixed $params 传入参数
* return void
*/
function hook($hook, $params = array()) {
\Think\Hook::listen($hook, $params);
}
好了,你就可以在控制器或者模板中使用该函数调用插件了。例如在模板的某个位置添加{:hook('test')},系统会在执行到这个位置的时候,输出'hello,world'
下面说一下插件的特点,
1.自定义的HOOK在注册后,需要手动调用hook()方法来执行。
2.插件类中的方法名可以自由定义,无需一定要有run()方法,可以有多个方法. 例如,因为在tags中注册了test,test1两个HOOK,所以模板也是可以使用{:hook('test1')}的,会输出‘12’。
但是该插件类中的test2方法,虽有实现,但是没有注册,因此如果在模板中调用{:hook('test2')}会什么都不会输出的
3.插件目录中,可以有控制器,模型等,具体参考onethink.
与行为相比,我个人的感觉是,插件不但定义了标签位,还定义了标签位要使用的方法。
而行为是,标签位,已经定义好,你只需要定义这个地方的实现(只能是run)。
---------------
网上很多对于TP 插件机制的描述,大同小异,基本可以认定是抄袭的,以上的描述,全部经过我个人测试,没有问题。
最佳答案
