云客Drupal8源码分析之实体类型bundle信息服务entity_type.bundle.info
来源:互联网 发布:利于优化文章系统 编辑:程序博客网 时间:2024/06/05 21:56
实体类型bundle信息服务在容器中的服务id是entity_type.bundle.info,从代码上说这是一个很简单的服务,用以获取系统中实体类型的bundle信息,由于她充分的展示了什么是bundle,进一步帮助理解bundle这个概念,因此本系列将她作为一个独立主题来讲述。
服务id:entity_type.bundle.info
类:Drupal\Core\Entity\EntityTypeBundleInfo
实现接口:Drupal\Core\Entity\EntityTypeBundleInfoInterface
第一级键名为实体类型id,第二级为bundle名,里层是一个关联数组:人类可读的bundle标签和该bundle的可翻译性。
可以在控制器中执行以下代码查询你系统中的所有bundle信息:
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的解释)等等。
服务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的解释)等等。
我是云客,【云游天下,做客四方】,微信号:PHP-world,欢迎转载,但须注明出处,讨论请加qq群203286137
阅读全文
0 0
- 云客Drupal8源码分析之实体类型bundle信息服务entity_type.bundle.info
- 云客Drupal8源码分析之实体类型管理器、实体类型、实体Entity
- 云客Drupal8源码分析之实体Entity概述
- 云客Drupal8源码分析之用户角色实体
- 云客Drupal8源码分析之内容实体概述Content Entity
- 云客Drupal8源码分析之实体字段管理器entity_field.manager
- 云客Drupal8源码分析之实体entity(一):实体基类
- 云客Drupal8源码分析之实体Entity(二)配置实体基类
- 云客Drupal8源码分析之实体Entity(三)配置实体储存处理器
- 云客Drupal8源码分析之实体Entity(五)内容实体基类
- 云客Drupal8源码分析之实体entity(六)内容实体储存处理器类
- 云客Drupal8源码分析之内容实体数据库表结构及表映射table mapping
- 云客Drupal8源码分析之内容实体储存模式处理EntityStorageSchema
- 云客Drupal8源码分析之前言
- 云客Drupal8源码分析之Session系统
- 云客Drupal8源码分析之HttpKernel堆栈
- 云客Drupal8源码分析之Session进阶
- 云客Drupal8源码分析之页面标题
- ORM简介
- 利用sprintf和sscanf实现十六进制和十进制之间的相互转换
- jvm学习1
- 理解MySQL——索引与优化
- 程序员对自己的未来有何打算
- 云客Drupal8源码分析之实体类型bundle信息服务entity_type.bundle.info
- HTTP请求中POST与GET的区别
- html&css-----------颜色(11/2)
- Centos之GitBook文档工具安装与使用-yellowcong
- 魔术方法 :_autoload ,spl_autoload_register
- 老司机带你学习GreenDao3
- (转)如何快速处理线上故障
- 监听器,request.session.servletcontext生命周期
- 在ubuntu16.04中如何使用caffe训练自带的mnist数据集