云客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的解释)等等。

 

我是云客,【云游天下,做客四方】,联系方式见主页,欢迎转载,但须注明出处

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值