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

时间:2012-02-11 21:43:27

标签: php oop design-patterns plugins observer-pattern

对于如何在PHP应用程序中实现插件有共识吗?

我已经查看了接近的observer pattern,它实际上只是一个通知系统,并且不允许代码直接扩展应用程序。我目前正在使用我提出的简单钩子系统:

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);
        }
    }
}

这对我的目的很有用,但我很好奇是否有一个经过多次测试和验证的设计模式,我只是重新发明了这个轮子。

6 个答案:

答案 0 :(得分:9)

Silver Bullet意义上没有达成共识。对于已建立的模式,您有多个选项,如

仅举几例。

您使用的由您决定,但您应该确保您的系统架构支持模块化。看看这些幻灯片中的一些想法

答案 1 :(得分:3)

我认为事件调度程序是一种很好的,干净的方式来实现插件或任何扩展。事件调度程序是Observer模式的实现,正在symfony中使用,Symfony2Zend Framework 2(beta)。

查看github上的任何来源都会有一些有趣的阅读。虽然,可以在这里找到一些有趣的信息:

http://components.symfony-project.org/event-dispatcher/trunk/book/02-Recipes

几年前我为一个项目写了一个Events and Hooks课程,如果能找到的话,我会在这里发帖。

答案 2 :(得分:1)

看看Yii框架。 Yii严重依赖于比钩子,动作等更清晰的事件。使用事件,您可以允许系统的不同部分以面向对象的方式相互通信。

答案 3 :(得分:1)

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

ZF manual reference

答案 4 :(得分:1)

你使用钩子的方式也是我实现这个的方式。

您的示例的最大问题是您的函数实例化插件。为什么不传递插件的实例呢?

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

答案 5 :(得分:0)

嗯,jin-plugin右侧有一个名为Wikipedia article about Plugin concept的项目链接。我也是第一次看到这个框架,但是,也许,你可以马上使用它。

此外,您应该谷歌搜索“插件模式”之类的内容,我在第一页上找到了两个链接:Plug-in PatternExtensibility pattern (wikipedia)

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

P上。 S.感谢您提出质疑,无论如何,您确实对此话题提出了自己的兴趣。 ;)