天天看点

云客Drupal源码分析之实体entity(六)内容实体储存处理器类

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

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

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

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

内容实体储存处理器类,顾名思义就是解决内容实体的储存问题,这主要有两大块内容:

1、 实体数据从储存后端的读写,这个过程需要派发钩子让模块参与进来;

2、 实体储存后端的管理,也就是schema的增删改,先有这才能进行数据存取;

储存处理器类是drupal核心之一,比较大,但学习完后您将全面彻底理解实体,建议您先阅读本主题文尾的补充内容,那将让你更好更容易理解本主题,然后再回到这里继续阅读。

在系统中比较典型的是节点实体储存处理器:

Drupal\node\NodeStorage

这是一个很庞大的类,要容纳处理好几条逻辑流:新建实体、更新实体、新建版本、更新版本、新建翻译、更新翻译及Schema维护等等,研究这个类能看到实体储存处理的基本面貌,系统中储存处理器继承结构如下:

节点实体储存处理器继承结构(自上而下依次继承,及实现的接口):

。。。

内容实体储存基类:

。。。

SQL内容实体储存处理器基类SqlContentEntityStorage

该基类执行和数据库有关的详细功能,你可能会奇怪她实现了以下接口

Drupal\Core\Entity\EntityBundleListenerInterface

但实现的方法却是空的,这是因为她是一个基类,默认情况下没什么需要做的,但有时候bundle变化是需要让储存处理器知道的,在具体的储存处理器中可以实现该逻辑,在服务entity_bundle.listener(见本系列相关主题)中如果储存处理器实现了该接口会调用相应方法。

这里列出该基类的一些重点方法的解释:

。。。

以下介绍常用操作的流程和涉及到的钩子

默认内容实体创建流程:

。。。

创建涉及钩子及执行顺序如下:

1、 字段值初始化钩子:$entityTypeId . '_field_values_init' 和'entity_field_values_init'

2、 创建钩子:$entityTypeId . '_create' 和'entity_create'

注意创建实体后并不会被自动保存,如需保存需要显式调用save方法

默认内容实体加载流程:

。。。

默认内容实体版本加载流程:

。。。

默认内容实体保存流程:

。。。

默认内容实体删除流程:

。。。

默认内容实体版本删除流程:

。。。

实体翻译创建流程:

。。。

实体释文键解释:

persistent_cache:

布尔值,默认为true,指示该实体类型产生的实体是否可以进行持久缓存,如果可以则将实体对象序列化后缓存在数据库表cache.entity中,缓存id为:"values:$entityTypeId:$id",缓存标签为:[$entityTypeId . '_values','entity_field_info',]

动态可字段实体储存接口:

。。。

动态可字段实体储存模式接口:

。。。

实体查询:

有这些内容:依据实体属性加载实体、实体查询、实体聚合查询,该块内容很常用,本系列用单独一篇主题介绍,请看后续系列

字段的自定义储存:

系统提供了默认的储存方式,我们大多数时候不需要自定义储存,但在特定情况除外,本系列将专门开设一个主题来讲解她。

补充内容:

1、 可版本化的内容实体的isNew()方法返回的并不是版本是否为新,而是指实体是否为新,只要有一个版本存在那么所有版本都不是新的,判断是否为新建的版本可以用getLoadedRevisionId方法,返回为空表示满意版本id,那么就是指代为新的版本。

2、内容实体构造函数参数解释:

。。。

3、可翻译性:

。。。

4、源语言Original language:

。。。

继续阅读