// 事件触发
$requrst = Request::factory() // bootstrap.php
// 事件触发
controller::before(){// 事件触发}
controller::after(){// 事件触发}
// 事件触发
$requrst->execute()
// 事件触发
// 事件触发
$requrst = Request::factory() // bootstrap.php
// 事件触发
controller::before(){// 事件触发}
controller::after(){// 事件触发}
// 事件触发
$requrst->execute()
// 事件触发
controller::before()
controller::after()
这两个相当于2.x版本中的system.pre_controller和system.post_controller,只是特定的两个注入点,3.x中缺乏的是一种通用的hook机制
hook很好嚰,hook就像给系统内核打补丁,系统执行的时候这些hook不管是否真正需要,都被执行,这不是什么好的方案。
Kohana 3.x 已经全面取消了 hook 和 event 机制,就像 @Yahasana 所说的,不断的打补丁不利于长期的开发和维护,尤其是维护。
我建议对于 kohana 不能完成的功能,使用继承覆写的方式扩展功能。
在者就是做好 base controller/model 也是一个不错的选择。
@Yahasana , @icyleaf :
可能我上面回复中提到的 'hook' 使你们产生了误解,我主题中提的是 'Event' 模块,跟 KO 2.x 中的 hook 没有关系。
我觉得 event 模块应该算是 观察者 模式的一种实现,我希望实现的功能是在某个事件发生的时候,所有关心该事件的模块都可以对此事件进行一些处理,我们看一个现实中的例子:
我在做一个电商系统,涉及订单的处理需求,需要在订单成功支付的时候做以下处理:
1. 给客户发一封通知邮件
2. 给客户增加相应的积分
3. 其他
如果不使用 event 类似的一个模块,我需要把发送邮件(mail模块)、增加积分(积分模块)、其他(其他模块)的逻辑混在订单处理(订单模块)的逻辑里面,而且以后要增加其他的操作的时候仍需要修改这个地方的代码;如果使用event类似的模块来实现,我只需要在订单模块里面添加一个自定义的“订单支付”事件,在订单支付的时候触发一下该事件,其他关心该事件的模块就会自动调用了。
使用 event 模块是不是好的解决方案我也不知道,不过目前没找到其他的方式处理。
PS: 有人把ko2中的evnet模块移植到了ko3中,有需要的同学可以使用( https://github.com/samsoir/kohana-event )
发表讨论