关于tp5中的自定义钩子

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就是这样做的

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A黄俊辉A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值