原文标题:Understanding Drupal 8's config entities
Drupal8 引入了一个新的实体类型,配置实体。
使用Drupal 7的人会对其内容的实体(entity)很熟悉。
Drupal8 提出了配置实体的概念,这非常类似于drupal7中导出的CTools,但是实体系统有许多优化。
这些使用基于代码的方法来建站的人会很熟悉CTools 输出。
在drupal 7,CTools 被利用于Views, Panels, Page Manager, Context及很多其他模块,来提供一个相对简便的输出配置方式来实现部署和版本控制的目的。
Drupal 8 提出了一个新的概念叫配置实体,来更大程度的效仿这个功能。
示例配置实体
在drupal8的核心中已经有了这些配置实体:视图(Views), 词汇表(Vocabularies),联系表单分类(Contact form categories),用户邮件模板(User email templates),显示设置(display settings),区块实例(block instances),快捷键设置(shortcut sets),自定义菜单(custom menus) 和图像样式(Image styles)。
名单上仍需要转换的还有节点类型(node type)和语言(language)。
更多信息请参阅the issue跟踪这些转换。
与内容实体的区别
Drupal 7 中的实体已正式更名为“Content Entities”。内容和配置实体之间的主要区别是他们是如何存储的以及(此刻)配置实体是不可操作的(虽然在这个问题上改变它有点草率)。
配置实体使用CMI系统存储,比如:在你的config文件夹的YAML文件里。配置实体的YAML文件遵循特定的命名约定(前缀),而且迁移该模块的一些默认配置和新建一个YAML文件一样容易。
例如在views 模块的config目录中可以看到一些默认的views。
作为一个Drupal8里工作流程有多大变化的例子——从git下载最新版本的Drupal8,并创建一个view。注意到不再有“导出(export)”链接了吗?想知道为什么吗?导航到你的有效配置存储(这将是sites/default/files/config/activeXXXX),其中XXXX是一种hash(哈希数)。在里面你会找到你的网站当前的views的YAML文件。迁移这些到你部署的网站将跟提交这些文件进行版本控制并部署到生产站点的临时区域,然后将其导入使用的用户界面(UI)或drush命令一样简单。
现在开始看到配置实体来部署工作流程的意义了吗?在该文件中,你可以发现有很多已有的配置,当你找到node types, menus, block instances, text formats等时,会觉得很不错吧。编辑:在评论中,Justin正确指出,确保有依赖关系仍然是配置分期流程的重要组成部分。
演示
作为一个例子,让我们创建一个图像样式。
看看你启用的配置——sites/default/files/config/activeXXX,你将看到你现有的图像样式。
接下来创建一个新的使用这个图像样式的用户界面,在启用的存储(active store)里,你会发现一个新的配置文件。
现在,复制这个文件和图像样式清单到你网站的临时存储,这可能是通过版本控制或其他一些部署方法,但这个例子的目的,我们只是复制和粘贴在本地安装。临时存储在sites/default/files/config/stagingXXX。它看起来应该像这样。
现在,在第二个站点上的用户界面(at admin/config/development/sync),同步你的配置。
现在看一下你第二个站点的图像样式。
注意:运行导入(import)将会删除临时目录中的所有文件。
在底层
那么你怎么去创建一个配置实体?这个过程是很简单的——如果在Drupal7中,你有一个这样的模块,整合了CTools exportables来控制你的存储,那在Drupal8中,你很有可能会用到配置实体来控制你的存储。有人已经预言,模块不这样做,将被视为坏了的。
定义你的配置实体类
首先,你需要一个实体插件,可以说你的实体类型和模块被称为机器人(robot)。依照PSR-0,你创建以下目录。
robot/lib/Drupal/robot/Plugin/Core/Entity/Robot.php
在这里你定义机器人(Robot)的配置实体类。
/** * @file * Contains Drupal\robot\Plugin\Core\Entity\Robot. */ namespace Drupal\robot\Plugin\Core\Entity; use Drupal\Core\Config\Entity\ConfigEntityBase; use Drupal\Core\Annotation\Plugin; use Drupal\Core\Annotation\Translation; /** * Defines the robot entity. * * @Plugin( * id = "robot", * label = @Translation("Robot"), * module = "robot", * controller_class = "Drupal\robot\RobotStorageController", * list_controller_class = "Drupal\robot\RobotListController", * form_controller_class = { * "default" = "Drupal\robot\RobotFormController" * }, * uri_callback = "robot_uri", * config_prefix = "robot.robot", * entity_keys = { * "id" = "id", * "label" = "label", * "uuid" = "uuid" * } * ) */ class Robot extends ConfigEntityBase { // ....Definition of robot's properties... // e.g.: /** * The custom block type ID. * * @var string */ public $id; }
然后,有趣的是,你需要使用程序来创建存储,列表和表单控制器提供存储,列表和表单功能。
存储控制器
你的存储控制器需要扩展Drupal\Core\Config\Entity\ConfigStorageController,除非你有复杂的要求,你可以在很大程度上使用的默认实现。
列表控制器
对Drupal8而言,列表控制器也是新增加的,但他们基本上提供了一种统一的方式列出一组实体,过去的与CTools exportables 有关的东西,以admin/structure/views为例子思考视图列表(the views listing)。
你的存储控制器需要扩展Drupal\Core\Config\Entity\ConfigEntityListController。
作为最低限度,你要自定义实现::buildRow(), ::buildHeader() and ::getOperations()这些方法。看一下核心中的一些实现是一个很好的起点。
表单控制器
表单控制器扩展自Drupal\Core\Entity\EntityFormController,您将需要执行::form()方法来定义表单(使用表单的API),为用户创建一个新的实体实例。
:: save()方法是在那里你可以处理保存你的实体,大多数实现会做这样的事情:
你可能需要重写的还有其他的方法,但是,save和form是你需要覆写时最常用的方法。
总结
在Drupal8,配置实体将改变我们的工作方式。
正如你所看到的meta问题,仍有大量的工作要做,快速提升你的Drupal8技能,从它的开始就参与,现在是时候参与进来!
编辑:感谢@ timplunkett指出了我的示例代码的几个问题。
本文由风筝翻译,龙马校对,转载请注明出处:http://www.longma.org/node/29