1. 程式人生 > >雲客Drupal8原始碼分析之外掛系統(上)

雲客Drupal8原始碼分析之外掛系統(上)

各位《雲客drupal8原始碼分析》系列的讀者:
本系列一直以每週一篇的速度進行部落格原創更新,希望幫助大家理解drupal8底層原理,並縮短學習時間,但自《外掛系統(上)》主題開始部落格僅釋出前言和目錄,這是因為雲客在思考一個問題:drupal在國外如此流行但在國內卻很小眾,一個重要原因應該是中文資料的缺乏,我們是否能夠找到一種方式來激發中文資料的出產?此時同是積極推動者的晴空提出能否用付費閱讀的方式來鼓勵更多作者?並建立了一個付費閱讀drupal資料的網站,個人覺得也許這能激發高質量原創內容的出產,學習者支付很少費用可以節省大量學習時間是划算的,作者也能分配精力去開發高質量內容而得到報酬,drupal普及開了對大家都有益處,為了支援晴空的這個專案,雲客決定將從《外掛系統(上)》主題開始後續內容全部放在這個網站上收費閱讀,讀者只需要付很少費用即可,雲客在這裡承諾該系列得到的所有訂閱費用全部捐獻給drupal深圳社群,用以組織活動等等,發展社群需要大家貢獻力量,該網站已於2017年3月29日上線,請移步:

http://nowicode.com/ 閱讀本篇完整版

我是雲客,【雲遊天下,做客四方】,微訊號:php-world,歡迎轉載,但須註明出處,討論請加qq群203286137

****************************************以下為前言和目錄,請移步:http://nowicode.com/ 閱讀本篇完整版*******************************

外掛系統是drupal中非常重要的一塊內容,非常多的地方用到了它,本系列將分上下兩篇來講解它,上篇為基本內容,能一窺外掛全貌和常見使用,下篇為高階使用

外掛是什麼?

在讀本篇前強烈建議看完本系列前面關於鉤子的介紹,外掛本質上就是使用面向物件程式開發模式實現的鉤子,但它比鉤子系統更加先進靈活,鉤子是相對於面向過程程式開發而言,狹義點講,一個鉤子就是一個函式,一個外掛就是一個類。

他們都是在某個點來實現某類似功能,鉤子比較簡單,通過函式的命名規則來進行查詢,而外掛類則高階強大許多,一個類可能很大,系統中有許多外掛,全部載入的話也會消耗大量記憶體,類可能也需要配置資料,如果通過命名來查詢那麼會限制其靈活性,所以依靠命名這種查詢方式不適合外掛系統,因此在drupal中使用外掛類的元資料來查詢外掛,這個過程叫做外掛的發現Discovery

外掛的發現Discovery:

在drupal中提供了四種方式來查詢外掛,他們都是基於外掛類的元資料:

1:StaticDiscovery

靜態發現,其實很簡單,就是將外掛的元資料儲存在一個物件的屬性中,這個物件可以新增、查詢元資料,進而通過元資料找到外掛類

2:HookDiscovery

用鉤子機制去獲取外掛類的元資料

3:AnnotatedClassDiscovery

釋文發現機制,這也是drupal主要使用的發現機制,下文重點講解

4:YamlDiscovery

將外掛元資料儲存在yaml檔案中,在drupal核心中使用這種方式來進行本地任務

釋文外掛類發現機制:

這是drupal最主要使用的外掛發現方法,它有個優點:將元資料和類放在一起,在我們寫php程式的時候,可以用到行註釋“//”和塊註釋“/* */”,釋文發現機制就是利用了塊註釋,外掛是一個類檔案,我們將這個外掛的元資料儲存到類的塊註釋中,系統掃描外掛目錄,以字串方式讀取php檔案內容(並不以php檔案載入的方式,這樣就節省了記憶體使用)然後解析出塊註釋裡面的元資料,就可以通過這些元資料找到對應的外掛類了,你可能會問那且不是要進行巨大的計算量?確實如此,但別忘了有快取,因此這樣的計算只會進行一次,況且元資料可以攜帶許多引數,所以釋文發現機制是比較不錯的。下面來看一看drupal的具體實現:

預備知識:

釋文物件:

外掛系統的構成:

外掛管理器:

外掛定義:

釋文語法:

定義釋文物件:

預設外掛管理器DefaultPluginManager:

附屬內容: