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