# 插件架構
* * * * *
### 什么是插件?
插件是用于擴展系統的功能的一些獨立“組件”。
插件的定位是用于實現某些簡單的顯示及數據處理的功能擴展。所以我們的初衷是插件的開啟關閉,不會影響原有數據。
物理定義:
位于站點根目錄 /addon 下的一個類庫,可以被系統的hook函數訪問到。

* * * * *
### 什么是鉤子?
講到插件,不得不講鉤子。首先,插件是一個擴展的功能實現。
既然是擴展的,那么就要很靈活、可復用,并不是像我們之前開發項目,一個功能實現了,就寫死在代碼里了。
項目其他地方要用了,怎么辦,復制一份改個名,改的那個地方能調用實現。這樣一次兩次可以,次數多了就不行了。
因為后面每次開發的底層架構在不斷變化。不斷重復的功能版本造成人力的浪費。我們做成插件的目的就是為了方便大家擴展我們這個產品的功能。到時候形成規模,大家自由的搭建自己的站點就方便了。
那么如何讓一個擴展的功能在多個地方可隨意的使用呢。那就用到了我們的鉤子。
為什么叫它鉤子呢?因為它的作用就是如此和生活中的鉤子類似。
打個比方,我們做的網站比作一個有多個功能的立式衣架。
這個衣架給什么人用就有不同的用途。
假如你專門用來掛大衣的,那就是大衣衣架。如果你專門掛袋子,那就是一個儲物衣架。
當你不想要某個掛件、衣服時,取下來即可。并不會破壞原有的袋子或者衣服的功能。
你掛與不掛,鉤子就在那里。
為什么能掛那么多東西呢?說明被掛的東西都符合一個標準:能掛的住。
換作你掛一個橡皮泥、或者棉花之類的。掛不了多久就會掉了。因為他們不符合要有部分封閉的可固定的這一個部分的標準。
還有掛一個太重的比如10個背包掛一個鉤子上。要么架子毀了,要么鉤子斷了。總之就是掛不住。
因為任何一個鉤子都有其承重上限。你加起來的超過了,肯定不行。
所以我們不能把插件當成萬能的使,什么東西都整成插件,不管功能的大小。
任何系統都有瓶頸,你不能把個重量級的東西做成插件后掛上,說不定以后就會影響整個站點。就違背了插件的獨立性原則。那些就不應該做成插件而是做成模塊或者服務擴展。
* * * * *
### OneBase插件結構
公共模塊下有一個AddonBase類,此類繼承自ControllerBase 說明是一個控制器的子類,所有插件的控制器都需要繼承AddonBase類,在此類中重寫了框架的fetch與_get方法,實現了像其他模塊一樣的模板渲染方式及依賴注入對象。
**注意:** 插件的業務邏輯層繼承的是app\common\model\Addon 而 不是 app\common\logic\Addon。因為此處的繼承只是為了實現模型層對象的注入,所以無需繼承app\common\logic\Addon。邏輯層的Addon里面封裝的是插件的執行,安裝,卸載等機制。
在v1.2版本中插件的靜態資源移動到了public/static/addon目錄下,在插件的模板中使用 __STATIC __會自動定位到插件的靜態資源目錄中。
插件也不例外,作者建議盡量將業務邏輯封裝在業務邏輯目錄中,供控制器引用,數據庫相關操作盡量封裝在ModelBase中,供業務邏輯層引用。
- 序言
- 基礎
- 安裝環境
- 安裝演示
- 規范
- 目錄
- 介紹
- 后臺介紹
- 后臺首頁
- 會員管理
- 系統管理
- 系統設置與配置管理
- 菜單管理
- 系統回收站
- 服務管理
- 插件管理
- 文章管理
- 接口管理
- 優化維護
- SEO管理
- 數據庫
- 文件清理
- 行為日志
- 執行記錄
- 統計分析
- 接口介紹
- 接口文檔
- 錯誤碼設計
- Token介紹
- 前臺介紹
- 架構
- 架構總覽
- 生命周期
- 入口文件
- 模塊設計
- 依賴注入
- 控制器架構
- 邏輯架構
- 驗證架構
- 服務架構
- 模型架構
- 行為架構
- 插件架構
- 配置
- 配置介紹
- 配置加載
- 配置擴展
- 請求
- 請求信息
- 日志
- 后臺行為日志
- 系統執行日志
- 框架日志
- 數據
- 數據庫設計
- 數據字典
- 數據庫操作
- 事務控制
- 混合操作
- 實戰
- 控制器
- 邏輯與驗證
- 視圖與模型
- 插件研發
- 服務研發
- 接口研發
- 雜項
- 數據導入導出
- 二維碼條形碼
- 郵件發送
- 云存儲服務
- 支付服務
- 短信服務
- 微信分享
- 生成海報
- 聊天室
- PJAX
- Demo
- Widget
- 附錄
- 常量參考
- 配置參考
- 函數參考
- 進階
- Redis
- 自動緩存
- 全自動緩存
- 索引
- 數據簽名
- 全自動事務
- 隊列