天天看點

雲客Drupal源碼分析之實體entity(六)内容實體儲存處理器類

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

本系列分享希望幫助大家了解drupal8底層原理,并縮短學習時間,但部分重點内容在部落格僅釋出前言和目錄,這是因為:drupal在國外如此流行但在國内卻很小衆,一個重要原因應該是中文資料的缺乏,我們是否能夠找到一種方式來激發高品質的中文資料出産?此時同是積極推動者的晴空提出能否用付費閱讀的方式來鼓勵更多教程作者?并建立了一個付費閱讀drupal資料的網站,學習者僅需支付很少費用即可查詢到最用心的知識注解,避免大量查找資料,可以節省大量學習時間是劃算的,作者也能配置設定精力去開發高品質内容而得到回報,drupal是精品中的精品,超過一半的世界五百強用她做網站,難能可貴,國内普及初期需要一個良好的土壤,普及開後免費内容會越來越多,為了支援國内發展,雲客決定将重點内容放在晴空的這個網站上收費閱讀,讀者隻需要微信支付很少費用即可,雲客在這裡承諾該系列得到的所有訂閱費用全部捐獻給drupal深圳社群,用以組織活動等等,發展社群需要大家貢獻力量,該網站于2017年3月29日上線,請移步:http://nowicode.com/ 閱讀本篇完整版

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

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

内容實體儲存處理器類,顧名思義就是解決内容實體的儲存問題,這主要有兩大塊内容:

1、 實體資料從儲存後端的讀寫,這個過程需要派發鈎子讓子產品參與進來;

2、 實體儲存後端的管理,也就是schema的增删改,先有這才能進行資料存取;

儲存處理器類是drupal核心之一,比較大,但學習完後您将全面徹底了解實體,建議您先閱讀本主題文尾的補充内容,那将讓你更好更容易了解本主題,然後再回到這裡繼續閱讀。

在系統中比較典型的是節點實體儲存處理器:

Drupal\node\NodeStorage

這是一個很龐大的類,要容納處理好幾條邏輯流:建立實體、更新實體、建立版本、更新版本、建立翻譯、更新翻譯及Schema維護等等,研究這個類能看到實體儲存處理的基本面貌,系統中儲存處理器繼承結構如下:

節點實體儲存處理器繼承結構(自上而下依次繼承,及實作的接口):

。。。

内容實體儲存基類:

。。。

SQL内容實體儲存處理器基類SqlContentEntityStorage

該基類執行和資料庫有關的詳細功能,你可能會奇怪她實作了以下接口

Drupal\Core\Entity\EntityBundleListenerInterface

但實作的方法卻是空的,這是因為她是一個基類,預設情況下沒什麼需要做的,但有時候bundle變化是需要讓儲存處理器知道的,在具體的儲存處理器中可以實作該邏輯,在服務entity_bundle.listener(見本系列相關主題)中如果儲存處理器實作了該接口會調用相應方法。

這裡列出該基類的一些重點方法的解釋:

。。。

以下介紹常用操作的流程和涉及到的鈎子

預設内容實體建立流程:

。。。

建立涉及鈎子及執行順序如下:

1、 字段值初始化鈎子:$entityTypeId . '_field_values_init' 和'entity_field_values_init'

2、 建立鈎子:$entityTypeId . '_create' 和'entity_create'

注意建立實體後并不會被自動儲存,如需儲存需要顯式調用save方法

預設内容實體加載流程:

。。。

預設内容實體版本加載流程:

。。。

預設内容實體儲存流程:

。。。

預設内容實體删除流程:

。。。

預設内容實體版本删除流程:

。。。

實體翻譯建立流程:

。。。

實體釋文鍵解釋:

persistent_cache:

布爾值,預設為true,訓示該實體類型産生的實體是否可以進行持久緩存,如果可以則将實體對象序列化後緩存在資料庫表cache.entity中,緩存id為:"values:$entityTypeId:$id",緩存标簽為:[$entityTypeId . '_values','entity_field_info',]

動态可字段實體儲存接口:

。。。

動态可字段實體儲存模式接口:

。。。

實體查詢:

有這些内容:依據實體屬性加載實體、實體查詢、實體聚合查詢,該塊内容很常用,本系列用單獨一篇主題介紹,請看後續系列

字段的自定義儲存:

系統提供了預設的儲存方式,我們大多數時候不需要自定義儲存,但在特定情況除外,本系列将專門開設一個主題來講解她。

補充内容:

1、 可版本化的内容實體的isNew()方法傳回的并不是版本是否為新,而是指實體是否為新,隻要有一個版本存在那麼所有版本都不是新的,判斷是否為建立的版本可以用getLoadedRevisionId方法,傳回為空表示滿意版本id,那麼就是指代為新的版本。

2、内容實體構造函數參數解釋:

。。。

3、可翻譯性:

。。。

4、源語言Original language:

。。。

繼續閱讀