54. 实体类型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

如果尚无缓存数据,那么构建过程如下:

执行钩子“entity_bundle_info”以收集模块定义的bundle信息

循环查找所有的实体类型,如果在释文中设置了bundle_entity_type,那么取出所有的实体bundle

第二步是充分理解“bundle”概念的关键,在系统中实体类型的一个bundle其实就是一个实体,用以储存这个实体的类型叫bundle实体类型,这就是为什么在实体释文键中叫做“bundle_entity_type”这个名字的原因,意为储存这个bundle信息实体的实体类型。在系统中“node”实体类型是储存内容的,它的bundle是一个配置信息对象,用来补充字段信息,储存这个配置信息对象就需要一个配置实体,因此“node_type”是一个储存配置实体的配置实体类型,用来储存“node”实体类型的bundle实体。

在前一步循环实体类型时,如果实体类型没有bundle,那么将自己作为自己的bundle

执行修改钩子“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);

思考两个问题:

内容实体类型用来储存内容,她的bundle是一个配置实体,用来补充字段信息,那么配置实体类型是来储存配置信息的,她的bundle又是什么呢?来做什么呢?在系统中还没有出现配置实体类型的bundle,它是一个实体并用来补充“配置项”信息吗?

“实体”和“实体类型”的区别,为什么在drupal9中舍弃“实体管理器”而很多功能直接用“实体类型”管理器呢?

通过本主题的学习你是否感受到了系统选定“bundle”这个名词的原因呢,是的,那就是“附加”、“额外捆绑”,通过在一个大类上面添加一些新的属性变成一个小类,或者称为子类,添加的这些属性就是bundle,这个有点像OOP的继承,子类有更多属性,或者说子类是更细的细分。

在drupal中节点就是一个大类,各内容类型就是一个子类,这种抽象级别是很高的。从不同角度看可以给bundle不同的解释,比如是一个子类别的信息容器(官网的解释)、一个扩展数据模型(对比国内一些cms的解释)等等。

本书共98小节:

评论 (写第一个评论)