天天看點

雲客Drupal源碼分析之實體字段管理器entity_field.manager

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

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

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

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

實體字段管理器

實體字段管理器用于擷取和實體類型有關的字段資訊,她讓各子產品參與建設實體類型的字段定義,是所有内容實體類型的字段定義中樞,在涉及實體字段資訊時大多會用到她,比如節點實體儲存處理器用它來确定資料庫表資訊,是以很重要,以下講述她的各種方法:

容器服務id:entity_field.manager

擷取方法:\Drupal::service('entity_field.manager');

Class:Drupal\Core\Entity\EntityFieldManager

接口:Drupal\Core\Entity\EntityFieldManagerInterface

基本字段定義:

一個可字段化的實體類型自身定義(非bundle定義)的字段稱為基本字段,她們存在于所有的bundle中,也就是說所有bundle可用,除實體類型自身可定義外,子產品也可以通過鈎子entity_base_field_info向其添加基本字段定義,還可以通過修改鈎子hook_entity_base_field_info_alter()對實。。。

字段定義(含bundle):

方法getFieldDefinitions($entity_type_id, $bundle)得到的字段定義包括基本字段定義和Bundle字段定義,其中基本字段自定義可以被Bundle根據自己需要而修改,以array_replace($base_field_definitions, $bundle_field_definitions);方式進行覆寫,Bundle字段定義緩存在數。。。

字段儲存定義:

在getFieldStorageDefinitions($entity_type_id)方法中擷取某實體類型的全部字段儲存定義,包括基本字段和bundle字段,實際上系統就是根據該方法的傳回值确定實體類型的資料庫表結構的(見節點儲存處理器中的表映射對象),注意一個基本字段的儲存定義和完整定義是相同的,也就是說實作。。。

字段映射:

方法getFieldMap()傳回一個字段資訊數組,叫做字段映射,借此你可以判斷某實體類型下的每個字段是什麼類型,在哪些bundle裡面可用,該數組形式如下:

Array

(

僞字段/額外字段概念Extra Fields:

這裡有一個“僞字段pseudo-field”的概念,僞字段不在資料庫中儲存資料,也沒有輸入控件和顯示格式化器,曾被叫做标記字段markup-field,用于。。。

作者語:

一個好的系統一定經過了多次打磨,每一次打磨都會有相應的理由,這往往是充分的,使用者在接觸到最終版本時,往往看不到曆次打磨的理由,進而不了解為什麼會那麼做,此時你需要慢慢品嘗,drupal來之不易,站在開發者的角度,面對自己打造出來的作品,開發者會有把她推向極緻的沖動,這導緻許多次的修改更正,這花費了大量時間,冰凍三尺非一日之寒。學習者需要多看曆史和保持學習的耐心。

由此想到一個有趣的問題:當drupal大到超出單個人所能承受知識總量時,如何去學習和推進是一個有意思的話題

繼續閱讀