天天看點

雲客Drupal源碼分析之插件系統(上)

各位《雲客drupal源碼分析》系列的讀者:

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

我是雲客,【雲遊天下,做客四方】,聯系方式見首頁,歡迎轉載,但須注明出處

****************************************以下為前言和目錄,請移步: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:

附屬内容: