跳到内容
必威体育论坛必威精装下载APPRedfin解决方案的标志必威体育论坛必威精装下载APPRedfin解决方案的标志 联系
鸟类的迁徙

理解Drupal 8的Migrate API

在过去的这个周末,我很荣幸能够在2017年的会议上发表演讲新英格兰Drupal营关于Drupal 8的Migrate API。必威体育论坛Redfin实现许多Drupal 8迁移日期从CSV数据来源和遗留Drupal站点(Drupal 6和7)。因此,我们想要与你分享我们学到了什么,希望节省你的时间通常在数据迁移的试验和错误。

我的硕士学位是技术教育,所以我理解人们学习东西的方式不同。有些人是听觉或视觉学习者,而另一些人喜欢阅读。为此,我想在这里总结一下我们的会议。如果你是一个音频或视觉学习者,请查看以下资源:

否则,让我们来看看概念……

整个过程是:

  1. 构建一个模块(.info.yml文件)。您可以使用Drupal控制台对于这个。
  2. YAML文件定义您的迁移。
  3. 如果需要,设置任何全局配置(settings.php中的遗留数据库连接凭据、用于CSV文件的文件夹等)。
  4. 扩展/修改/编写任何自定义插件或代码来支持这些迁移。

虽然您可以使用Drupal Migrate UI来实现这一点,但我建议您按照自己想要的方式构建Drupal 8站点(例如,可以利用新的范例,如段落),然后再考虑迁移问题。在不使用UI的情况下,有四个主要模块可以发挥作用。其中两个是核心的——migrate和migrate_drupal。“migrate”让你可以把任何东西放到Drupal 8中,而“migrate_drupal”扩展并支持这一点,以增强你从Drupal 6或7(或8!)站点迁移IN时的体验。

贡献空间中的两个模块提供的帮助远远超过核心所提供的。迁移工具提供了用于管理迁移的命令集成迁移+为迁移数据提供大量增强功能(额外的插件等)。顺便说一下,确保为您的Drupal版本使用正确的模块版本是很重要的,但这很容易,因为您正在使用作曲家,对吧?

写一些迁移

您需要将迁移YAML文件放到模块的/migrations文件夹中。通常,yaml文件以您为迁移插件指定的id命名。作为一个完整的例子,请看核心的d7_node.yml迁移。

Migrate API遵循传统的软件设计模式提取、转换、加载.为了避免与“加载”(在这里是指将数据加载到Drupal数据库)的概念产生混淆,在Migrate中使用了一些不同的术语:

  • 提取源= =
  • 变换过程= =
  • 负荷= =目标

Migrate Plus提供的一个概念是“迁移组”。这允许多个迁移在所有迁移中共享某些配置。例如,如果所有迁移都来自同一个MySQL数据库(比如Drupal 6数据库),那么共享配置可以进入迁移组配置一次,而不是进入每个单独的迁移。

每个迁移都有一些全局配置,例如它的“id”键(这个迁移的唯一id)和它的“标签”(UI / Drush中的友好名称)。

你还可以指定“依赖项”——例如一个模块。您还可以强制执行“migration_dependencies”,这意味着在运行这个迁移之前,需要运行那个迁移。这是确保引用(如实体引用或分类法术语)在使用之前迁移到站点的一种很好的方法。

然后,每个迁移都应该指定三个独特的部分——源、过程和目标(听起来熟悉吗?)

source部分指定要使用的插件。这些插件通常可以在相关模块中找到。例如,如果你想从Drupal 7节点迁移数据,可以在core/modules/node/src/Plugin/migrate/source中查看要使用的实现/插件id。但是,通常情况下,您会发现自己在自己的模块中编写了一个扩展了这个类的新类。

每个不同的源插件可能都有一些附加的配置。例如,使用"plugin: d7_node",你也可以指定"node_type: page"来从Drupal 7站点迁移基本页面。您还可以在这里指定“key”,表示要使用设置中的$databases数组中的哪个数据库键(如果在迁移组中没有全局指定该键的话!)

所有源插件的目的都是提供统一的Row对象(core/modules/migrate/src/Row.php),该对象可以被流程的下一部分使用。

如果您确实编写了自己的迁移插件,我发现自己经常重写的两个方法是query()(这样我就可以向典型的源查询添加条件,例如——比如只抓取去年的博客帖子)和prepareow()。方法prepareow()是操作即将被转换并加载到数据库中的Row对象的类似钩子的机会。您可以在prepareerow()中添加额外查询的信息,或将某些值转换为其他值,或任何您需要的值。唯一要注意的是每一行成为一个目的地的实体,所以如果你做一些像加入分类来说,你做得好,在prepareRow和添加一个新的属性setSourceProperty()而不是,说,离开加入查询中。

目的地(是的,我跳过了过程)

目标插件的工作方式大致相同。您只需指定要迁移到的实体(通常)。例如,你可能有目的地:“实体:节点”以及任何与目的地相关的附加配置。entity:node的一个例子是添加default_bundle:页面在这里,你不需要在你的进程部分设置bundle: 'page'(我们将会讲到)。类似地,如果迁移文件,您可以指定source_base_path:“https://example.org”在导入时自动从该路径下载图像!

和源插件一样,目标插件也有附加的配置。

Drupal 8中有很多实体,这里的可能性非常大——你可以迁移节点、用户、评论、文件,当然。但您也可以迁移配置、表单显示、实体视图模块、任何贡献中的内容,或者您自己的遗留代码!Migrate Plus还提供了一个“Table”目标,这样你就可以直接迁移到Drupal内部的MySQL表中(注意,如果你迁移到实体中,这通常不是最佳实践——你最好使用实体:无论什么插件,这样你就可以充分利用实体API)。

过程

在我看来,这里才是真正神奇的地方。为了保持这篇博文的简短(是不是太晚了?),我不会深入讨论所有可用的过程插件,但我会讨论一些特殊情况,然后鼓励您这样做请自己查看文档

“get”插件是最基本的。它仅仅意味着“将属性x的值从Row对象中移除,并将其映射到值y。”在真正的迁移的yml文件中,它看起来是这样的destVal: sourceVal-这意味着“获取$row->sourceVal中的内容,并将其放入目标的“destVal”属性中。

“migration_lookup”插件比get更进一步,并将传入的ID转换为新站点上的新ID值。例如,如果你有一个迁移,迁移65人节点和国家免疫日约翰·史密斯的Drupal 6网站,但907新Drupal 8网站,引用这个人的“作者”字段(比如你的“研究”内容类型)也需要翻译。这个插件通过引用已经运行过的迁移(还记得migration_dependencies键吗?)将传入的65转换为正确的907。

多个插件甚至可以链接在一起,形成可以按顺序发生的转换的“管道”。例如,如果您的旧数据库只有“Chris Wells”和“Patrick Corbett”用户名,但是您想要创建用户名,您可以通过machine_name插件改为“chris_wells”。但是,如果已经有一个“chris_wells”用户呢?然后,您可以运行新值dedupe_entity添加一个“1”或“2”等直到它是唯一的。您可以在yml文件中创建相当复杂的管道,而不需要修改任何PHP代码。

有时候Drupal中的字段有一个“嵌套值”,比如body或link字段。body字段上有一个“值”和一个“格式”。要映射这些字段,可以使用斜杠(/)分隔字段和子字段,例如“身体/值”:描述“身体/格式”:格式——只是要确保在这些类型的键周围使用“勾号”(撇号、单引号,随便你怎么称呼它们)。

您可以自由地查看所有核心进程插件,甚至包括由contrib提供的插件,如:get、migration_lookup、machine_name、dedupe_entity、default_value、concat、bomb、flatten、static_map、substr、skip_on_empty、skip_row_if_not_set、menu_link_parent、callback、entity_generate和entity_lookup!

还有一个特殊的,以前称为“迭代器”,现在称为“sub_process”。这让您可以针对结构化数据数组数组创建多步骤的管道。一定要特别注意这一点。

把它们放在一起

现在,您已经按照自己的想法创建了新的Drupal 8站点,并编写了一个模块(实际上是.info.yml文件)。你把所有的迁移都放在里面了。你可以将它们放在配置/安装中,它们将被读取为配置。然后,您可以使用德config-edit或类似的Drupal控制台。您还可以在每次修改yml文件时卸载并重新安装模块。

或者,你也可以把它们放在/migrations中(从你的模块根目录下),取而代之的是它们将被加载为插件而不是配置。这种方式可能是首选的,因为当您对YML文件进行更改时,只需刷新插件缓存即可。

一旦你也有你的源设置(数据库,CSV文件,XML,无论什么),你可以开始运行你的迁移与Drush!

在我的世界里,最常用的Drush命令是:

  • 移民地位-事情在哪里?
  • 迁移-导入-运行迁移(单个或整个组)
  • migration -rollback -“unrun”迁移
  • 当你写的PHP代码出错或按下Ctrl-C时,可以将迁移重置为“空闲”状态。

其他我不经常使用的是:

  • 停止正在运行的迁移,并将其重置为空闲(我通常按Ctrl-C,然后执行德夫人(migrate-reset-status))
  • migration -fields-source -在Row上列出要导入的所有可用属性(我通常只在prepareerow()的调试器中检查)
  • migration -messages——显示迁移过程中捕获的消息(PHP警告等)(我通常只查看存储这些消息的数据库表,而不是在终端中打印它们)

哇。

这就是答案。概括地说就是迁移!请随时在下方留下评论和问题接触如果你需要将数据迁必威体育论坛移到新的Drupal 8站点,可以在Redfin上与我们联系。

Baidu