【问题标题】:Plugin system with events or hooks?带有事件或钩子的插件系统?
【发布时间】:2015-01-27 17:40:56
【问题描述】:

我已经为 php 中的软件创建了一个插件系统。为了让插件改变程序的行为,我编写了这个(简化的)代码:

class PluginController {

  /* ... */

  public function addHook($name, $function, $priority = 10) {
    /* store the function callback $function  associated with $name */
  }

  public function executeHook($name, $args = array()) {
    /* execute all function callbacks associated with $name
     * in order of their priority and return their results */    
  }
}

因此插件可以使用addHook 添加回调,并且在应用程序的某处通过调用executeHook 来执行这些回调。

这很好用,但是在阅读了一些关于该主题的时间后,我仍然不确定这种技术是 event- 还是 hook- 系统。

一些消息来源说差异与松散和紧耦合有关。 其他人说钩子有返回值,而事件没有。并且其他人再次说事件是用于处理异步活动的,而挂钩只是为了在某些时候注入代码。

再说一遍,上面的代码是关于events还是hooks,有人能解释一下区别吗?

【问题讨论】:

    标签: php events architecture hook


    【解决方案1】:

    您的代码更像是一个事件。

    Hooks 允许插件与调用它的代码进行交互。调用它们时假设将返回数据,并且原始代码通常会在调用钩子后立即循环遍历返回的数据。

    另一方面,

    事件仅在发生特定操作时被调用以宣布。它们让插件有机会在此时运行自己的事件处理逻辑,而不会以任何方式直接影响原始代码。

    Source

    【讨论】:

    • 感谢您的回复。我在上述逻辑中看到了这两个定义的元素。原始代码可能会受到影响,因为 executeHook 参数可以传递给回调。这些参数可以是可以在回调中操作的对象(例如数据库查询构建器),并且这样做会影响原始代码。
    • @MarioA 钩子比事件小,它们只是获取数据并更改它,但事件更复杂,可以做很多事情
    • 我想我现在理解得更好了,但让我用我自己的话解释一下。因此钩子具有明确定义的任务和返回值(因此与应用程序更紧密地耦合),而事件侦听器可以执行任何类型的代码,应用程序对侦听器没有任何期望。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多