You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:24:03