天天看點

雲客Drupal源碼分析之實體類型bundle資訊服務entity_type.bundle.info

實體類型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的解釋)等等。

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