2012-02-11 86 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