RAD 框架的工程內部結構......作為 Nooku 的 PHP 開發人員
已發表: 2022-03-11每個人都有自己的一套工具。 作為一名 PHP 開發人員,我最喜歡的一個是名為“Nooku”的快速應用程序開發框架。 用開發組的話來說:“Nooku 更像是一個 Web 開發工具包,而不是一個框架”。
如果您不熟悉它,請看一下。 這是一個開源項目,大量使用行業接受的設計模式來生成高度組件化的應用程序,這些應用程序易於擴展和重用(最初由 Joomla! 的主要開發人員之一創建)。 開箱即用,Nooku 為您提供大量快速應用程序開發工具,幫助您更快地啟動項目。 一個小而強大的樣本:
- MVC 的默認實現,您需要做的就是編寫佈局(這就是吸引我的地方)
- HMVC 立即可用
- 支持所有數據的不同輸出格式,例如 JSON 和 XML(即,在幾分鐘內公開您的 API)
- 默認管理和前端實現
Nooku 的核心是“組合優於繼承”設計原則(事實上,這是 Nooku 介紹頁面上的第一個概念。一句話:您應該旨在組合(或疊加)多個對象的功能以創建一些一種複合對象,而不是依賴於子類化。
這個原則可以讓你編寫更少的代碼,並且通常會導致一些非常優雅的解決方案。 那麼具體是如何推廣的呢? 好吧,在代碼級別,最好的例子來自於使用 Mixins 和資源/服務標識符。 讓我們來看看。
混音
在 PHP 5.4 之前,該語言沒有Traits的概念。 這些是類結構,當被對象“使用”時,提供某種類型的功能(類似於多重繼承)。 Nooku 多年來一直在使用Mixin解決這個問題(從 PHP 5.2 開始)。
Mixin 不僅可以讓您將對象組合在一起,而且還可以將每個混合對象的方法添加到組合對象的接口中。 使用 mixin 的對像似乎“繼承”了混合對象的方法。
/** * Mixin an object * * When using mixin(), the calling object inherits the methods of the mixed * in objects, in a LIFO order. * * @param KMixinInterface $object An object that implements KMinxInterface * @return KObject */ public function mixin(KMixinInterface $object) { $methods = $object->getMixableMethods($this); foreach($methods as $method) { $this->_mixed_methods[$method] = $object; } // Set the mixer $object->setMixer($this); return $this; }
Nooku 中幾乎所有的對像都具有這種能力,因為它們擴展了定義mixin方法的基類 KObject。
Nooku 控制器架構中的主要類也是從 KObject 派生的。 抽象控制器是 KControllerAbstract 類,通過檢查您可以看到它立即利用了混合能力。 每當構造此類的實例時,KMixinCommand 和 KMixinBehavior 功能都會立即添加到其接口中。 因此,Nooku 中的每個控制器都通過各自的對象由命令鍊和行為管理功能組成。
為什麼所有類名前面都有K? Nooku 的主庫代號為“Koowa”。
回到 Nooku 控制器:KMixinBehavior 類包含所有部分,使 KControllerAbstract 能夠在運行時加載特定行為。 行為策略是描述可以被其他類分離和使用的過程或邏輯的類(例如,可編輯的、可排序的)。 KMixinBehavior 相當簡單,只有四個方法:getBehavior、hasBehavior、addBehavior 和 getBehaviors。 這就是我們需要賦予對象處理和封裝不同行為策略的能力。
同樣,KMixinCommand 只有三個方法:getCommandContext、getCommandChain、setCommandChain。 如果您沒有猜到,這三個方法為 KControllerAbstract 提供了實現命令鏈的能力,但讓它在運行時這樣做。
您可以將此混合視為簡單的算術加法:
給我們一個看起來像這樣的界面:

根據定義,抽像類旨在擴展,因此通過繼承的魔力,所有作為 KControllerAbstract 的子對像或實例的對像也獲得了在運行時添加行為和命令鏈的能力。
聽起來很酷。 但這實際上意味著什麼? 簡而言之,Nooku 提供了組件化的功能; 也就是說,Nooku 允許您模塊化您的功能並在運行時跨模塊組合功能。
這兩個示例用於演示組合。 它們還用於展示 Nooku RAD 框架對進一步組合的核心支持。 這是一個重要的優勢。 上面添加到 KControllerAbstract 的方法通過為開發人員提供工具來封裝在編寫一行代碼之前發生的變化,從而支持“策略設計模式”。 mixin() 方法是 KObject 的每個擴展的一部分這一事實意味著您可以在運行時輕鬆地為大多數對象定義和添加其他行為管理接口。
服務和資源標識符和定位器:將我的類名與我的對象分離
Nooku 中的服務和資源標識符和定位器也為關注點分離提供了強大的支持。
再一次,讓我們再看看 KObject,還有 KService。 我們可以將 Nooku 中的大多數事物視為服務或資源,並以完全相同的方式實例化和查詢它們。
將服務視為您從中獲取資源的東西。 所有服務都是資源,但並非所有資源都是服務
當您去雜貨店購買產品時,將商店視為服務,即您可以瀏覽的商品集合; 以及作為資源的產品,即單個項目/解決方案邏輯,可以是:
- 專門看(讀)(例如,看一罐番茄湯)
- 在商店周圍移動(編輯)(例如,將湯移動到產品過道)
- 添加到商店的庫存中或從商店的庫存中刪除( A dd 和D刪除)(例如,添加一種新的湯並去掉番茄)
更進一步地舉這個例子,想像雜貨店有一個特許經營部門,你想開展業務。 在這種情況下,服務是特許經營部門,資源是您購買的雜貨店。 這在很大程度上是一個上下文分類。 作為一個整體,這被稱為BREAD動作模式(您將看到在 KControllerService 和 KControllerResource 之間表示的每一個都以 '_action' 開頭,即 _actionRead())。
模型可以是服務,表對象可以被認為是服務,特定的 MVC 三元組被實例化為資源或服務,而查詢服務產生的特定記錄可以被認為是資源。
Nooku 中的每個對像都是對象的組合,其中每個對像都包含對“服務容器”中整個應用程序實例化服務的引用和訪問服務的方法,稱為 getService()。 KObject::getService() 方法所需要的只是我們傳遞一個有效的資源標識符,它會返回一個實例化的服務以供使用。
在 PHP 快速應用程序開發中,資源標識符為我們提供了一種強大的方法來將對象的實例化與其類名分離,從而為該標識提供別名。 這對應用程序的可維護性具有重要意義。 通過別名,開發人員可以通過使用 KService::addAlias() 添加一行代碼來更改使用給定標識符實例化的每個對象使用的類。
我們熟悉的資源標識符的一個示例是 URI 或統一資源標識符:
這是 KService 定位和加載適當類所需的所有信息。 這些部分與 Nooku 的類命名和放置約定相匹配,這些約定提供了放置和實例化的可預測性。 上面的標識符示例 (com://site/user.database.table.user) 嘗試加載文件 /components/com_user/databases/tables/user.php,該文件的類名為 ComUserDatabaseTableUser。 順便說一句,如果該文件不存在,框架將為您提供一個默認表對象,並根據數據庫命名和 id 模式約定構建它(這讓我更加著迷)。 如前所述,KService 還允許您為標識符設置別名。 使用KService::setAlias('maindbaseadapter','com://admin/default.database.adapter.mysqli')
; 讓我們用KService::getService('maindbaseadapter')
加載一個 db 對象。
這為我們提供了我們談到的解耦,並為我們的應用程序的維護和擴展提供了顯著的優勢。 如果需要,我們可以自由創建“站點”和“管理員”以外的應用程序,並且通過此處描述的標識符可以輕鬆使用位於其他應用程序中的服務來幫助我們的解決方案滿足他們的要求。 同樣,這是 Nooku 如何為 PHP 和 RAD 開發人員和團隊提供的另一個示例,不僅支持單個類對象的組合,還支持整個服務和應用程序的組合……免費。
加起來
以組合重於繼承為核心; 為支持進一步的汞合金而存在的智能、預先存在的組合物和結構; 以及帶有此處描述的標識符的免費的面向服務的架構,Nooku 提供了一個強大的 RAD 框架,與任何同行 PHP 開發工具相比具有顯著的領先優勢。