實體類型bundle資訊服務在容器中的服務id是entity_type.bundle.info,從代碼上說這是一個很簡單的服務,用以擷取系統中實體類型的bundle資訊,由于她充分的展示了什麼是bundle,進一步幫助了解bundle這個概念,是以本系列将她作為一個獨立主題來講述。
服務id:entity_type.bundle.info
類:Drupal\Core\Entity\EntityTypeBundleInfo
實作接口:Drupal\Core\Entity\EntityTypeBundleInfoInterface
這個服務類很簡單,隻有三個方法,我們重點看getAllBundleInfo()方法,她傳回一個描述所有實體類型的bundle資訊的數組,如下:
Array
(
[node] => Array
(
[article] => Array
(
[label] => 文章
[translatable] => 1
)
[page] => Array
(
[label] => 基本頁面
[translatable] =>
)
)
)
第一級鍵名為實體類型id,第二級為bundle名,裡層是一個關聯數組:人類可讀的bundle标簽和該bundle的可翻譯性。
可以在控制器中執行以下代碼查詢你系統中的所有bundle資訊:
\Drupal::service('entity_type.bundle.info')->clearCachedBundles();
$bundle_info = \Drupal::service('entity_type.bundle.info')->getAllBundleInfo();
print_r(array_keys($bundle_info));
print_r($bundle_info);
exit();
Bundle資訊被緩存在cache.discovery表的以下cid中:
entity_bundle_info:目前語言id
如果尚無緩存資料,那麼建構過程如下:
1、 執行鈎子“entity_bundle_info”以收集子產品定義的bundle資訊
2、 循環查找所有的實體類型,如果在釋文中設定了bundle_entity_type,那麼取出所有的實體bundle
第二步是充分了解“bundle”概念的關鍵,在系統中實體類型的一個bundle其實就是一個實體,用以儲存這個實體的類型叫bundle實體類型,這就是為什麼在實體釋文鍵中叫做“bundle_entity_type”這個名字的原因,意為儲存這個bundle資訊實體的實體類型。在系統中“node”實體類型是儲存内容的,它的bundle是一個配置資訊對象,用來補充字段資訊,儲存這個配置資訊對象就需要一個配置實體,是以“node_type”是一個儲存配置實體的配置實體類型,用來儲存“node”實體類型的bundle實體。
3、 在前一步循環實體類型時,如果實體類型沒有bundle,那麼将自己作為自己的bundle
4、 執行修改鈎子“entity_bundle_info”給子產品機會去修改bundle資訊,在預設情況下這一步中content_translation子產品給bundle加上了是否啟用翻譯的标志,鈎子函數名為:content_translation_entity_bundle_info_alter,位于以下檔案中:
core\modules\content_translation\content_translation.module
判斷一個bundle是否啟用翻譯的代碼是:
\Drupal::service('content_translation.manager')->isEnabled($entity_type, $bundle);
思考兩個問題:
1、 内容實體類型用來儲存内容,她的bundle是一個配置實體,用來補充字段資訊,那麼配置實體類型是來儲存配置資訊的,她的bundle又是什麼呢?來做什麼呢?在系統中還沒有出現配置實體類型的bundle,它是一個實體并用來補充“配置項”資訊嗎?
2、 “實體”和“實體類型”的差別,為什麼在drupal9中舍棄“實體管理器”而很多功能直接用“實體類型”管理器呢?
通過本主題的學習你是否感受到了系統標明“bundle”這個名詞的原因呢,是的,那就是“附加”、“額外捆綁”,通過在一個大類上面添加一些新的屬性變成一個小類,或者稱為子類,添加的這些屬性就是bundle,這個有點像OOP的繼承,子類有更多屬性,或者說子類是更細的細分。
在drupal中節點就是一個大類,各内容類型就是一個子類,這種抽象級别是很高的。從不同角度看可以給bundle不同的解釋,比如是一個子類别的資訊容器(官網的解釋)、一個擴充資料模型(對比國内一些cms的解釋)等等。
我是雲客,【雲遊天下,做客四方】,聯系方式見首頁,歡迎轉載,但須注明出處