天天看点

云客Drupal源码分析之实体字段管理器entity_field.manager

各位《云客drupal源码分析》系列的读者:

本系列分享希望帮助大家理解drupal底层原理,并缩短学习时间,但部分重点内容在博客仅发布前言和目录,这是因为:drupal在国外如此流行但在国内却很小众,一个重要原因应该是中文资料的缺乏,我们是否能够找到一种方式来激发高质量的中文资料出产?此时同是积极推动者的晴空提出能否用付费阅读的方式来鼓励更多教程作者?并建立了一个付费阅读drupal资料的网站,学习者仅需支付很少费用即可查询到最用心的知识注解,避免大量查找资料,可以节省大量学习时间是划算的,作者也能分配精力去开发高质量内容而得到回报,drupal是精品中的精品,超过一半的世界五百强用她做网站,难能可贵,国内普及初期需要一个良好的土壤,普及开后免费内容会越来越多,为了支持国内发展,云客决定将重点内容放在晴空的这个网站上收费阅读,读者只需要微信支付很少费用即可,云客在这里承诺该系列得到的所有订阅费用全部捐献给drupal深圳社区,用以组织活动等等,发展社区需要大家贡献力量,该网站于2017年3月29日上线,请移步:http://nowicode.com/ 阅读本篇完整版

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

****************************************以下为前言和目录,请移步:http://nowicode.com/ 阅读本篇完整版*******************************

实体字段管理器

实体字段管理器用于获取和实体类型有关的字段信息,她让各模块参与建设实体类型的字段定义,是所有内容实体类型的字段定义中枢,在涉及实体字段信息时大多会用到她,比如节点实体储存处理器用它来确定数据库表信息,因此很重要,以下讲述她的各种方法:

容器服务id:entity_field.manager

获取方法:\Drupal::service('entity_field.manager');

Class:Drupal\Core\Entity\EntityFieldManager

接口:Drupal\Core\Entity\EntityFieldManagerInterface

基本字段定义:

一个可字段化的实体类型自身定义(非bundle定义)的字段称为基本字段,她们存在于所有的bundle中,也就是说所有bundle可用,除实体类型自身可定义外,模块也可以通过钩子entity_base_field_info向其添加基本字段定义,还可以通过修改钩子hook_entity_base_field_info_alter()对实。。。

字段定义(含bundle):

方法getFieldDefinitions($entity_type_id, $bundle)得到的字段定义包括基本字段定义和Bundle字段定义,其中基本字段自定义可以被Bundle根据自己需要而修改,以array_replace($base_field_definitions, $bundle_field_definitions);方式进行覆写,Bundle字段定义缓存在数。。。

字段储存定义:

在getFieldStorageDefinitions($entity_type_id)方法中获取某实体类型的全部字段储存定义,包括基本字段和bundle字段,实际上系统就是根据该方法的返回值确定实体类型的数据库表结构的(见节点储存处理器中的表映射对象),注意一个基本字段的储存定义和完整定义是相同的,也就是说实现。。。

字段映射:

方法getFieldMap()返回一个字段信息数组,叫做字段映射,借此你可以判断某实体类型下的每个字段是什么类型,在哪些bundle里面可用,该数组形式如下:

Array

(

伪字段/额外字段概念Extra Fields:

这里有一个“伪字段pseudo-field”的概念,伪字段不在数据库中储存数据,也没有输入控件和显示格式化器,曾被叫做标记字段markup-field,用于。。。

作者语:

一个好的系统一定经过了多次打磨,每一次打磨都会有相应的理由,这往往是充分的,用户在接触到最终版本时,往往看不到历次打磨的理由,进而不理解为什么会那么做,此时你需要慢慢品尝,drupal来之不易,站在开发者的角度,面对自己打造出来的作品,开发者会有把她推向极致的冲动,这导致许多次的修改更正,这花费了大量时间,冰冻三尺非一日之寒。学习者需要多看历史和保持学习的耐心。

由此想到一个有趣的问题:当drupal大到超出单个人所能承受知识总量时,如何去学习和推进是一个有意思的话题

继续阅读