2012-02-11 82 views
22

关于如何在PHP应用程序中实现插件有共识吗?在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); 
     } 
    } 
} 

这非常适用于我的目的,但我很好奇,如果有一个设计模式,在那里,已经过测试和验证过很多次,我只是在重新发明轮子。

+0

我建议看看它如何与Wordpress工作。我不知道我自己,但我有一种感觉,它使用钩子,BOY wordpress有很多插件。好问题,upvoted。 – Relequestual 2012-02-11 23:48:50

+0

@Relequestual我熟悉WordPress,他们采取了一种程序性的方法与“行动”。 http://codex.wordpress.org/Function_Reference/add_action – 2012-02-12 00:00:56

+0

我要说这个问题不是一个骗局,但在某种程度上它是。似乎共识是在这里讨论http://stackoverflow.com/questions/42/best-way-to-allow-plugins-for-a-php-application – Relequestual 2012-02-12 00:04:33

回答

8

Silver Bullet没有达成共识。对于建立的模式,你有一个像

仅举几例。

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

+0

@Gordon你认为装饰主要'应用'对象(就像silex所做的那样),对它进行修改,然后返回它呢?然后你可以重复装饰这些,为每个新的应用程序修改添加更多的装饰器,并且能够随时删除每个修饰器而不影响其余部分? – Jimbo 2014-08-31 22:12:21

+0

@Jimbo当然,如果这就是你想要做的。但请记住,装饰器通常只在装饰类的现有API上运行。你也可以使用[Silex'before()'和'after()'hooks](http://silex.sensiolabs.org/doc/middlewares.html)。 – Gordon 2014-09-01 04:34:00

1

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

+0

我没有真正寻找代码示例,但我会看看,谢谢。 – 2012-02-12 23:44:45

0

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

此外,你应该真的谷歌像“插件模式”的东西,只有两个链接,我在第一页上找到:Plug-in Pattern,Extensibility pattern (wikipedia)

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

P. S.谢谢您的提问,无论如何,您确实提出了我对这个主题的兴趣。 ;)

1

Zend框架使用dispatchLoopStartup()在和dispatchLoopShutdown()在钩子类方法。每个插件都是实现前述方法的类。

ZF manual reference

1

你已经做到了这一点,用钩子的方式也我如何实现这一点。

虽然你的示例最大的问题是你的函数实例化插件。为什么不通过插件的实例呢?

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

+0

一个插件可以实现多个钩子,为每个钩子创建一个新的实例以避免共享状态。 – 2012-02-13 20:39:30

+0

共享状态是插件本身应该注意的事情。如果您需要单独的状态,请使用多个对象。 – Evert 2012-02-14 01:31:04

+0

为什么它是一个问题,虽然?它保持钩子实现分开,并且不需要跟踪插件实例。 – 2012-02-14 04:59:17

3

我认为一个事件派发器是一个很好,干净的方式来实现插件,或任何扩展的事情。 Events Dispatcher是观察者模式的实现,正在symfony中使用,Symfony2Zend Framework 2(测试版)。

通过github上的任何源代码查看将会提供一些有趣的阅读。虽然,信息的有趣的一点可以在这里找到:

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

我写了一个活动和挂钩类几年前的一个项目,我会后在这里,如果我能找到它。

+0

我想你从来没有找到它:) – kaiser 2014-07-03 15:33:53

+0

是啊,他从来没有发现它:-) – Jimbo 2014-08-31 22:03:53

+1

不,从来没有找到它。 :) – lshepstone 2014-12-03 17:04:56