在PHP应用程序中实现插件的设计模式

在PHP应用程序中实现插件的设计模式,php,oop,design-patterns,plugins,observer-pattern,Php,Oop,Design Patterns,Plugins,Observer Pattern,对于如何在PHP应用程序中实现插件,是否存在共识 我已经仔细研究了它,它实际上只是一个通知系统,不允许代码直接扩展应用程序。我目前使用的是我想出的一个简单的钩子系统: public function registerHook($hookName, array $params = array()) { $this->hooks[] = $hookName; foreach ( $this->plugins as $pluginName => $hooks ) {

对于如何在PHP应用程序中实现插件,是否存在共识

我已经仔细研究了它,它实际上只是一个通知系统,不允许代码直接扩展应用程序。我目前使用的是我想出的一个简单的钩子系统:

public function registerHook($hookName, array $params = array())
{
    $this->hooks[] = $hookName;

    foreach ( $this->plugins as $pluginName => $hooks ) {
        if ( in_array($hookName, $hooks) ) {
            $plugin = new $pluginName($this, $this->view, $this->controller);

            $plugin->{$hookName}($params);
        }
    }
}

这对我来说效果很好,但我很好奇是否有一种设计模式已经过多次测试和验证,我只是在重新发明轮子。

看看Yii框架。Yii严重依赖于事件,这些事件比钩子、动作等干净得多。使用事件,您可以允许系统的不同部分以面向对象的方式相互对话。

嗯,在中有一个名为right的项目链接。我也是第一次看到这个框架,但是,也许你可以马上使用它

此外,你们真的应该在谷歌上搜索“插件模式”之类的东西,我在第一页只找到了两个链接:

如果它真的是一种模式,那么它应该是语言无关的,因此您可以安全地从任何语言获取任何现有的解决方案,并将其转换为PHP


另外,谢谢你的提问,不管怎样,你确实引起了我对这个话题的兴趣

没有银弹意义上的共识。对于已建立的模式,您有多个选项,如

  • /,
  • ,
举几个例子

使用哪一种取决于您,但是您应该确保您的系统架构支持模块化。看一下这些幻灯片,了解一些想法


Zend Framework使用dispatchLoopStartup()和dispatchLoopShutdown()挂钩作为类方法。 每个插件都是实现上述方法的类


使用钩子完成此操作的方式也是我实现此操作的方式

不过,您的示例最大的问题是,您的函数实例化了插件。为什么不传递一个插件实例呢


我这样做的方式是,插件首先被实例化,然后注册它自己的钩子

我认为事件调度器是实现插件或任何扩展的一种好方法。事件调度器是观测者模式的一个实现,在symfony和(beta)中使用

在github上浏览任何一个源代码都会有一些有趣的阅读。不过,在这里可以找到一些有趣的信息:



几年前我为一个项目写了一个Events and Hooks类,如果我能找到它,我会在这里发布。

我建议看看它是如何与Wordpress一起工作的。我不知道我自己,但我感觉它在使用钩子,而且wordpress有很多插件。好问题,向上投票。@relequestitual我熟悉WordPress,他们采取“行动”的程序方法。我要说的是,这个问题不是一个骗局,但在某种程度上是。似乎这里讨论了共识,我读到了,但这是一条老线索。PHP5.3有许多可以利用的OO特性。通过observer模式,您可以/需要在希望扩展代码的地方激活observer。也就是说,你需要有指定的触发点,在这个触发点,你可以点击你的观察者,让他们告诉你是否还有其他需要做的事情。绝对不是最干净的代码插入方式,让它完成其余部分。我不是真的在寻找代码示例,但我会看一看,谢谢。一个插件可能会实现几个挂钩,为每个挂钩创建一个新实例以避免共享状态。共享状态是插件本身应该知道的。如果您需要单独的状态,请使用多个对象。但为什么这是一个问题?它将钩子实现分开,并且不需要跟踪插件实例。你失去了OOP提供的很多功能。通过这样做,可以有效地将对象视为静态对象。如果您想了解更多关于这方面的信息,请查找“依赖项注入”。一般的设计模式也会有好处。虽然现在这似乎不是问题,但我保证将来你会发现这是不灵活的……我想你从来没有找到过:)是的,他从来没有找到过:-)不,从来没有找到过请找到它……:)搜索仍在进行中。@Gordon对主“应用程序”对象(如silex)进行修饰,对其进行修改,然后返回,您认为如何?然后你可以重复地装饰这些,为每个新的应用程序修改添加更多的装饰器,并且能够在不影响其余部分的情况下随时删除每一个装饰器?@Jimbo当然,如果你想这样做的话。但请记住,装饰器通常只对装饰类的现有API进行操作。你也可以使用。