概述
如果你是从前端转过来的,一定对钩子这个词汇感觉很陌生,而且会很难理解为什么叫做钩子。
但如果我说生命周期,相信你们肯定不会陌生。
其实这个所谓的钩子,就相当于前端很多框架里的讲述生命周期。
而行为,其实就是事件。
一个钩子(生命周期)可以绑定多个行为(事件),反过来一个行为也可以注册到多个钩子(生命周期)上面。
本文章将采取层层递进的方式,讲述如何使用钩子和行为。
由最低使用条件,往个性化逐步增加复杂度。
系统内置钩子
最低成本使用
步骤:
1. 钩子绑定行为
application目录的tags.php文件,任意选择一个系统内置钩子进行行为绑定。
注意格式,比如你要绑定的行为类的是app\index\behavior\AopTry
,格式要和下图所示相同。
// 应用初始化钩子
'app_init' => [
'app\\index\\behavior\\AopTry'
],
2. 创建行为类
index目录创建behavior文件夹,behavior目录下创建AopTest.php类文件。
namespace app\index\behavior;
class AopTry
{
public function run($params){
echo '我是index模块下app_init钩子绑定的行为————AopTest';
}
}
上面这种形式可以最快实现钩子绑定行为,特别需要注明的是:
AopTry行为类的的方法名,如果你只需要定义了一个行为方法的话,可以取名为run
。
否则的话,方法名就是钩子名称的驼峰命名(首字母小写)。
所以,上面的例子里面其实方法名也可以取appInit
。
监听自定义钩子
步骤:
1. 钩子绑定行为
application目录的tags.php文件,任意选择一个系统内置钩子进行行为绑定。
这一步和之前最低成本使用一致,不做描述。
2. 创建行为类
namespace app\index\behavior;
class AppLove
{
public function run($params){
echo '我是app_love钩子的行为,yeah';
exit;
}
}
3. 控制器监听钩子
1)引用think\facade\Hook;
2)使用Hook::listen(‘钩子名’)监听。
namespace app\index\controller;
use think\facade\Hook;
class Index
{
public function index()
{
// 监听钩子
Hook::listen('app_love');
.....
}
}
动态绑定行为
步骤:
1. 控制器动态绑定行为
主要使用到了Hook::add('钩子名','行为类')
,这里需要特别注意第二个参数和前面最低成本使用的格式是一样的。
其实这一步做的工作就是上面2个例子在tags.php做的动作,而且个人认为把绑定行为的动作写在tags.php会更加方便日后查问题。
2. 控制器监听钩子
这里和监听自定义钩子
例子的一致,不做赘述。
3. 创建行为类
这里和监听自定义钩子
例子的一致,不做赘述。
控制器代码
use think\facade\Hook;
class Index
{
public function index()
{
// 1.动态绑定行为
Hook::add('app_love','app\index\behavior\AppLove');
// 2.监听钩子
Hook::listen('app_love');
...
}
}
需要特别注意的一点是,一定要先绑定行为,然后才监听,否则程序将出错。