Drupal 9自定义模块安装时程序化创建示例内容的最佳方法
Drupal 9 自定义模块安装时自动创建示例节点的最佳实现方案
方案1:原生实现(无第三方模块依赖,轻量场景通用标准方案)
这是业内针对小批量示例数据的最常用实现,完全不需要引入额外模块,不存在版本兼容问题。
实现步骤
- 在你的自定义模块根目录创建
[你的模块机器名].install文件,若文件已存在直接编辑即可 - 实现
hook_install()钩子,模块安装时会自动触发该钩子的逻辑执行,参考代码如下:
<?php /** * Implements hook_install(). */ function your_module_machine_name_install() { // 按你的自定义字段配置调整示例节点数据 $sample_nodes = [ [ 'title' => '示例内容1', 'type' => '你的自定义内容类型机器名', // 替换为实际内容类型ID,例如custom_news 'status' => 1, // 1为已发布,0为未发布 'uid' => 1, // 默认用管理员账号创建 'langcode' => 'zh-hans', // 多语言站点可按需调整语言代码 // 自定义文本字段示例 'field_custom_text' => [ 'value' => '这是自定义文本字段的示例内容', 'format' => 'basic_html', ], // 自定义图片字段示例 'field_custom_image' => [ 'target_id' => 123, // 替换为实际的文件fid,若不需要图片可删除该字段配置 'alt' => '示例图片说明', ], ], [ 'title' => '示例内容2', 'type' => '你的自定义内容类型机器名', 'status' => 1, 'uid' => 1, 'field_custom_text' => [ 'value' => '第二个示例节点的自定义内容', 'format' => 'basic_html', ], ], // 可按同样格式添加更多示例节点 ]; foreach ($sample_nodes as $node_data) { // 先查询是否已存在对应节点,避免重复创建 $existing_nid = \Drupal::entityTypeManager()->getStorage('node') ->getQuery() ->condition('type', $node_data['type']) ->condition('title', $node_data['title']) ->accessCheck(FALSE) ->execute(); if (empty($existing_nid)) { $node = \Drupal\node\Entity\Node::create($node_data); $node->save(); } } }
- 如需在模块卸载时自动删除示例节点避免数据残留,可在同一
.install文件中实现hook_uninstall():
/** * Implements hook_uninstall(). */ function your_module_machine_name_uninstall() { // 查询所有示例节点 $nids = \Drupal::entityTypeManager()->getStorage('node') ->getQuery() ->condition('type', '你的自定义内容类型机器名') ->condition('title', ['示例内容1', '示例内容2'], 'IN') ->accessCheck(FALSE) ->execute(); if (!empty($nids)) { $nodes = \Drupal\node\Entity\Node::loadMultiple($nids); foreach ($nodes as $node) { $node->delete(); } } }
方案优势
- 完全依赖Drupal核心API,适配所有Drupal9/10版本,无兼容风险
- 逻辑简单直观,小批量数据维护成本极低
- 不需要额外执行drush命令,模块安装时自动触发,对普通用户更友好
方案2:Migrate迁移方案(适合大量示例数据/测试数据复用场景)
就是你之前尝试的migrate+migrate_tools配合YAML文件的方案,适合示例节点超过20个,或者需要同时导入分类、媒体、用户等多类型关联数据的场景。
适配问题解决方案
当前drush10.6和migrate5.x的兼容问题可以通过临时锁定migrate模块版本为4.x稳定版解决,等官方修复合并到正式版后再升级即可。
方案优势
- 示例数据统一保存在YAML文件中,批量维护更清晰
- 迁移配置可以直接复用为自动化测试的测试数据源,和CI/CD流程打通更方便
选型建议
- 如果你的示例节点少于10个、无复杂关联数据,优先选择方案1,是目前业内的常规实现
- 如果需要维护大量结构化示例数据,或者有自动化测试需求,选择方案2收益更高
内容的提问来源于stack exchange,提问作者Dave Mattie
相关产品推荐
相关产品推荐

