前言
钩子和行为
钩子相当于一个插件,在某些执行顺序上插入进去。
行为可以在写app 接口中对所有请求执行到控制器前 执行登录用户的权限判断、登录token验证、发送websocket推送等,这样就不用在每个接口中判断了。
注意事项:
1.触发行为的关键方法是 Hook 类中的 listen 方法,它通过遍历某个行为标签下的所有行为,依次实例化并调用 run 方法
2.listen 方法中,如果之前在配置文件中开启了 DEBUG 模式,则它会生成日志记录你的行为,这里面牵涉到很多的 IO 操作,所以你的项目完成时建议取消 DEBUG 模式以提升速度。
3.listen 方法中,允许传递参数且只允许传递一个参数(传多个可以用数组呢),不过这个参数是引用传值,所以只能传入变量,传入常量会报错。
4.listen() 加载注册的标签(如 targs.php 里的)遍历注册标签的键取出值,并且依次实例化标签键的值存放的类,执行run方法。
一:行为定义
方法1:一般写在behaviour文件夹,例如 app\index\behavior\ActionTestBehavior 类
不传递参数
<?php
//测试行为类
namespace app\behavior;
class ActionTestBehavior
{
//run为行为的默认执行类,在有和行为标签相同名字的方法名情况下,不执行run,执行与行为标签同名的方法。
public function run()
{
dump('run方法测试');
}
//方法名为行为标签名的驼峰写法,比如app_init,对应appInit()
public function appAction()
{
dump('标签名驼峰命名法测试');
}
}
传递参数
<?php
//测试行为类
namespace app\behavior;
class ActionTestBehavior
{
//run为行为的默认执行类,在有和行为标签相同名字的方法名情况下,不执行run,执行与行为标签同名的方法。
//方法名为行为标签名的驼峰写法,比如app_init,对应appInit()
public function run($data)
{
dump($data);
dump('run方法测试');
}
public function appAction($data)
{
dump($data);
dump('标签名驼峰命名法测试');
}
}
方法2:闭包支持(添加行为标签时直接调用方法)
public function testIndex()
{
//闭包支持
//可以不用定义行为直接把闭包函数绑定到某个标签位
Hook::add('action_init',function(){
echo 'Hello,world!';
});
Hook::listen('action_init');
}
闭包支持也可以进行参数绑定
public function testIndex(Request $request)
{
$param = $request->only(['name','nickname','adress']);
//如果标签位有传入参数的话,闭包也可以支持传入参数
Hook::add('action_init',function($param){
var_dump($param);
});
Hook::listen('action_init',$param);
}
二:行为绑定(钩子绑定行为)
方法1:一般在应用目录和模块目录下面的 tags.php 里写入行为标签与行为的关联
//测试绑定
'action_test' => [
\app\behavior\ActionTestBehavior::class,
],
如果需要调用驼峰写法的方法名需要在 tags.php 中定义如下的行为标签与行为的关联
//测试绑定
'app_action' => [
\app\behavior\ActionTestBehavior::class,
],
方法2:控制器 Controller 中直接添加程序绑定
Hook::add('action_test',\app\behavior\ActionTestBehavior::class);
或者写在控制器中的构造方法中
public function __construct()
{
parent ::__construct();
\think\facade\Hook ::add('app_action', \app\behavior\ActionTestBehavior::class);
}
三:钩子放置
Hook::listen('action_list'); //在需要调用行为的位置,放置钩子监听调用