2010-06-18 19 views
2

我被要求做一個項目,客戶可以在其中創建PHP插件並將其添加到網站中......與WordPress插件的概念相同。如何製作支持插件的項目

製作支持該軟件的軟件的最佳方法是什麼?我不是在尋求解決方案,而是在尋求這個概念或結構。

+0

(* reference *)[Wikipedia on Plugin Architecture](http://en.wikipedia.org/wiki/Plug-in_%28computing%29) – Gordon 2010-06-18 09:28:15

+0

*(reference)* [Wordpress Plugin API](http:///codex.wordpress.org/Plugin_API) – Gordon 2010-06-18 09:28:56

+0

@戈登感謝我的朋友,我已經閱讀過有關這方面的內容。但我正在尋找PHP的概念。我應該如何使用PHP來管理它 – trrrrrrm 2010-06-18 09:35:24

回答

1

首先,你必須確定你想如何整合你的插件。如果你想要像Wordpress插件這樣的東西,大部分時間都是簡單的函數,那麼這非常簡單。這就像添加新代碼到您的應用程序。

那麼,基本上,你的應用程序應該能夠建立一個可用的插件列表,並確定哪些是可用的。該列表可以通過瀏覽文件,配置文件或其他內容來構建。例如,啓用的插件可以存儲在數據庫中。

然後,你只需做一個界面,用戶可以啓用每個可用的插件。啓用它時,Web應用程序會在插件數據庫中寫入關於它的信息,並指定它已啓用。然後,應用程序調用插件類的特定方法(實際上,OOP在正確的插件開發中是必需的),如Install()。爲了避免插件沒有這種方法時的異常,所有的插件類都應該繼承一個寫在主Web應用程序中的基類,該基類包含了該方法的定義。該方法的唯一目的是執行插件的初始化(創建表到數據庫,填充統計信息等)。

另外,在每個請求中,您的Web應用程序應包含指定爲啓用的所有插件文件。然後使用他們,但是你想要的。例如,從模板中調用他們的方法。如果你想編寫對模板開發人員透明的插件,那麼你可以像在wordpress中那樣做。在那裏,初始化時的插件(例如包含文件時)將特定數據寫入操作數組。它可以編寫什麼函數應該被調用,具有什麼參數以及何時被調用。 您甚至可以在主要Web應用程序中創建類似事件觸發器的事件來啓用自定義。在繪圖之前,調用一個名爲do_action("before_output_of_something")的函數,輸出結束後,調用函數do_action("after_output_of_something")。字符串參數將是觸發器數組中的一個鍵,指向一組操作(事件處理程序)。要添加事件處理函數,請調用這樣的函數,如add_action("before_output_of_something", $object, "method_name", array("parameters"))。 do_action方法傳遞操作數組,並使用PHP函數調用事件處理程序。

這個話題還有很多。一切取決於你想要做什麼。 我在這裏寫的只是一個糟糕的嘗試來表達一些可能性。你應該做的是找到一本好書,也許關於這個話題。

0

有多種選擇。最常見的是具有簡單插件功能的鉤子概念,您只需從中央配置腳本中包含()插件即可。每個插件必須自行註冊,所以通常有一個插件註冊方法。但它也可以僅僅是這樣的:

$app_plugin["add_title"][] = "do_whatever"; 
function do_whatever($request, &$page) {...} 

而且在主應用程序,你只定義了幾個插件調用,無論你看到它的必要性。你可以使用一個包裝函數來調用所有插件,但基本上你看掛鉤名稱,並調用所有註冊插件:

foreach ($app_plugin["add_title"] as $func) { 
    $output .= $func($_REQUEST, $page); 

每個命名鉤可以有不同的參數。通常你會想獲得額外的內容,但有時插件只是修改現有的變量,或影響應用程序流。

你有更多的鉤子,更多不同的擴展是可能的。而且沒有必要只使用函數。當然這個方案也適用於對象(它們只需要首先實例化)。

1

我會通過使用事件分派模式來解決這個問題。您可以在主應用程序中定義某些點(事件)。插件可以註冊這個事件,並在相關事件觸發時執行。

+0

例如[Symfony Components Event Dispatcher](http://components.symfony-project.org/event-dispatcher/)或[PEAR Event Dispatcher](http://pear.php.net) /包/ Event_Dispatcher /重定向) – Gordon 2010-06-18 10:05:22

+0

是的,我認爲有很多解決方案。由於Event-Dispatcher不是什麼大問題,我會自己編寫它以適應我的需求 – 2010-06-18 11:16:36