tp5的钩子相当于是在一个方法中,设定下了一个埋伏(用Hook::add()方法来设定) 当在一定的时机下触发它(就是在Hook::listen()方法时触发) 这有点像laravel 中的 fire
刚开始我不懂,这个钩子有什么用,埋下钩子,又在下一行触发它,不是多此一举吗? 直接写一个函数,在方法里调用函数不是和钩子的效果是一样的吗?
在不考虑代码的迭代修改的情况下确实是不需要 什么钩子的 一点用处都没有,还没有直接写函数中调用函数来的快
但是在实际开发的过程中,我们的代码是不断的在修改的,有时候一个方法完成之后,第二天的需求可以会在这段代码的前面写入一段逻辑,有时会在这段代码的后面写入一段逻辑,这时你可能会说,那还不简单,就直接在方法中添加就可以了,但是这样的做法是很 LOW的,我们要高B格一点,有一句话叫 对修改封闭,对扩展开放
这是说一下 高B格一点的做法,就是使用钩子 (有点像aop的思想 面向切面编程)
我们在设计一个方法时,只知道今天它要实现什么功能,明天,后天可能又要加一某些什么功能,这是我们写方法时,就可以在里面放下一个钩子
以下是第一天写的方法,考虑到明天,后天它的需求可以还要增加,为了避免修改我们已经写好的代码,这们可以这样写
public function mymethod(){
这里先埋一个方法执行前的钩子
这里写的是我们今天的业务需求
这里我的再埋一个方法执行后的钩子
}
这样当我们明天有需求变动的时候,我们就不用来修改这个函数,而只需要把新的业务写在钩子中就可以了,可以写在前面,也可以写在后面
这里我们一大至给一个例子
业务是付款成功后,我们要减去库存中商品的库存,并且增加商品的销量
public function pay(){
//伪代码
商品的付款代码 完成
//写完之后,我们知肯定还会有其它的操作,但现在不知道具体有什么操作,这们先在这里埋下一个钩子
Hook::add("pay_after","app\behavior");
Hook::listen('pay_after',$prams1,$parms2); //params1 是一个引入传值类型的参数,param2不是引用类型的参数
}
这样钩子埋好了,当第二天的时候,我们知道了付款完成后,我们要进行 减库存 加销量的操作
这时我们就可以把 减库存,加销量的方法写在钩子中
class PayBehavior{
public function payAfter($params1,$params2){
这是写上减库存的代码,
这里写上增销量的代码
}
}
可以看到我们pay()方法写完了之后,就不用去改动了,只是扩展了一个 payAfter()的方法
这就是高B格的 对修改关闭,对扩展开放
这里写一下tp5自定义钩子注意的问题
一个钩子是要先注册,才可以使用的 注册 就是 Hook::add()方法, 使用时就是 HOOK::listen()方法
所以 add 必须是在 listen方法之前的
二是钩子函数的声明时是使用小驼峰的方式声明,在注册的时候,监听的时候都是使用下划线的方式
如上例中的 声时 payAfter()方法 注册时则使用的 add("pay_after") listen("pay_after") 没有为什么,tp5就是这样做的