OpenLMSHong Kong

Drupal LMS 内部拆解:架构、实体与开发者体验

开发者层面的Drupal LMS 分析——实体模型、插件架构、Drupal 11 OOP hooks、Drush 指令,以及建置香港 LMS 部署所用的 DDEV 本机开发环境。

重点数据

Drupal LMS 建基于什么?
Drupal 10.3 或 11、PHP 8.1 以上(参考环境为 8.4)、MariaDB 11.4、nginx-fpm、Composer 2 与 Drush 13。
目前版本是多少?
Drupal LMS 1.2.4,于 2026 年 10 月 7 日发布,受 Drupal 安全公告政策保障,宣告相容版本为 ^10.3 || ^11。
核心实体有几个?
五个:lms_activity、lms_answer、lms_lesson、lms_course_status 与 lms_lesson_status。
activity 类型有几种?
十二种,包括四个 *_feedback 系列,会逐份作答向学员反馈。
本机开发怎样做?
用 DDEV。ddev composer si 执行标准安装;ddev composer sid 额外加入示范内容与开发者主控台。
这篇文章适合谁看?
为香港部署评估 Drupal LMS 的技术买家、IT 团队与开发者。

真实部署跑在什么之上

Drupal LMS 的参考开发技术栈刻意选得平淡无奇——而这正是它容易请到人、在香港又平宜的原因:

层组件版本
应用层Drupal Core11.x(LMS 支持 ^10.3 || ^11)
语言PHP8.1+(开发环境跑 8.4)
数据库MariaDB / MySQL参考环境为 11.4
Web 服务器nginx + PHP-FPM或 Apache
CMS 层Drupal LMS1.2.4(稳定版,受安全公告保障)
命令列Drush13.3+
依赖管理Composer2.x 配 drupal.org repository
本机开发DDEV以 Docker 为基础,备有 Tugboat 预览供评审

Drupal LMS 1.2.4 于 2026年 10 月 7 日发布,受 Drupal 安全公告政策保障,即稳定版本可获协调式安全应对。项目由 Tag1 Consulting 维护,American Federation of Teachers 提供初期及持续开发,并报告有 208 个汇报网站。

相容性

模块宣告相容 ^10.3 || ^11。如果供应商向你报 Drupal 9 或已停止支持的 8.x 核心版本,追问原因——那已远低于支持下限。

实体模型

Drupal LMS 建基于 Drupal 以设置驱动的实体系统,这正是它模块化的原因:所有东西都是「基础实体类型 + 设置」的组合。

实体机器名称用途
LMS Activitylms_activity学员在课节内做的一件单一事情
LMS Answerlms_answer存储学员对某个 activity 的作答
LMS Lessonlms_lesson课程内的一个课节
LMS Course Statuslms_course_status追踪学员在一门课程内的进度
LMS Lesson Statuslms_lesson_status逐课节追踪完成状态

状态实体正是 Drupal LMS 把进度追踪做成建模层级概念的原因。进度是作为数据被记录,而不是从报表反推——因此一名学生三年的纪录可以直接查询,不需要任何供应商专属的导出格式。

activity 类型与它们的许可范围

activity 类型是 lms_activity 的各种组合。公开的类型集覆盖了相当广泛的评估范围:

  • select_single——单选题
  • select_multiple——多选题
  • true_false——对错题
  • free_text——文字作答
  • file_upload——文件提交
  • webform——以 Webform 表单作为 activity
  • xapi_tincan——xAPI/Tin Can activity
  • no_answer——纯信息区块
  • *_feedback 系列——select_single_feedback、select_multiple_feedback、true_false_feedback、free_text_feedback,逐份作答实时反馈

*_feedback 系列比看上去重要。逐份作答实时反馈,会把一个 activity 从评分事件变成学习事件——这对微学习和课程内的形成性评估都很关键。

事件、消息与通知

LMS Messages 与 Drupal 的 Message 模块集成,在 LMS 事件时发送通知。公开的消息类型清楚地显示了生态所预期的工作流程:

  • lms_messages_new_request——收到加入申请
  • lms_messages_approved_request——申请获批
  • lms_messages_rejected_request——申请被拒
  • lms_messages_answer_comment——学员作答被留言
  • lms_messages_course_evaluation/lms_messages_course_evaluated——已提交评价/学员已评价

对一个企业审批流程——例如员工申请外部培训、主管审批——头三个消息类型就构成完整循环。没有通知的审批流程,就是一个卡在收件匣里的流程。

群组:课程、班别与群体

Drupal LMS 使用 Drupal 的 group 模块,设有两种群组类型:课程群组用 lms_course,课程内的班别小组用 lms_class。这正是学校班级结构与企业以群体为单位的课程交付背后的机制——中十班、管理发展 cohort、全部门合规群组。

DDEV 开发环境

至于本机开发与新项目模板,生态建议采用以 DDEV 为基础的入门环境。DDEV 提供容器化、可重现的环境,本机毋须安装 PHP 或数据库。

git clone [email protected]:graber-1/drupal_lms_ddev.git
cd drupal_lms_ddev
ddev start
ddev composer install
ddev composer update drupal/lms
ddev composer si      # 标准安装
ddev composer sid     # 安装+示范内容+开发者主控台

两个安装脚本值得留意。si 执行一个使用现有设置的精简安装;sid 额外执行一个名为 lms-ctt("create test training",使用简单密码)的 Drush 指令,并安装开发者主控台——产出一个已填入测试内容的网站,正好适合向客户示范或让新开发者上手。

参考设置写得很明确:php_version: "8.4"、database: mariadb 11.4、webserver_type: nginx-fpm、nodejs_version: "16",并配备 Selenium standalone Chrome 容器作浏览器测试,以及为每个分支设置预览环境的 Tugboat。

Drupal 11 OOP hooks 与质量工具

Drupal 11 把 hooks 从程序式文件搬到带属性的 OOP hooks。定制模块宣告一个 hook 的样子如下:

 [
      'variables' => ['data' => NULL],
    ],
  ];
}

质量工具链是配套的一部分,不是可选项:

  • PHPUnit(9、10.5 或 11)——单元、kernel 与功能测试
  • PHPStan,附弃用规则与严格规则,并为既有问题设有基准线
  • PHPCS / PHPCBF,采用 Drupal 编码标准
  • config_inspector,用于设置变更侦测

而因为 Drupal LMS 本身就是一个分叉,向上游贡献是正常工作流程:把模块复制到 web/modules/contrib/lms、把你的分叉加为 remote、在 issue 分支上开发,然后开 merge request。模块树本身已附带 phpcs.xml、phpstan.neon 与 phpunit.xml。

这对香港买家意味着什么

你买的不是一个黑盒。你买的是建在一个主流 CMS 上的 GPL 代码,有公开文档的实体模型、已发布的社区模块、具名的维护者,以及一套标准工具链。对香港机构而言具体来说:

  • 无按人授权——一间 1,200 名学生的学校或8,000 名员工的企业,不会多出一项按人计算的授权开支。
  • 公开的模块列表——你可以清楚看到什么存在、什么不存在,而不必相信一份供应商功能对照表。
  • 内容可携——SCORM、xAPI、H5P 与 YAML 封装都能带走。
  • 完整数据库访问与标准导出,因为那是你的数据库。
  • 招聘人选充足——Drupal 与 PHP 技能并非小众,与某些专有LMS 技能组合不同。
诚实的另一面

以上一切都以「有人有能力运维它」为前提。一个无人运维的 GPL 平台,比有支持合同的授权产品退化得更快。这是真正的取舍,而且是一个人事问题,不是软件问题。

关于平台架构的问题

我们需要开发者才能运行吗?

运行本身不需要——日常管理是一般后台工作。但要有人套用更新,而平台扩展得越多,这一点越重要。如果您本身有Drupal或PHP的技术能力,这是实质优势;如果没有,实际选项是托管或支持安排,我们会直接说哪一个更合适。

数据模型是怎样的?

Drupal LMS围绕五个核心实体——课程、用户、内容、测验同结果——建构,附两种群组类型(课程同班别)以及一组消息类型处理通知。进度是以建模的数据记录,而不是从报表推算,所以三年期的学员纪录不需要任何厂商专属导出格式也可以查询。

DDEV是什么?对我们有什么重要性?

DDEV是一个本地开发环境,可以让开发者用几分钟在手机电脑上启动一套可运行的Drupal LMS,采用容器而非手工搭建PHP与数据库环境。对您而言,它的意义在于降低我们为您做客制开发的成本,也令日后交接给您团队变得现实。

支持Drupal 11吗?

支持。重写版本针对Drupal 10.3及以上,包括Drupal 11,并采用对象导向的attribute hook机制而非旧有的程序式做法。文章会交代如果日后由您团队维护客制代码,哪些开发体验差异是真正重要的。

我们大概需要多少客制开发?

通常是设置而非写程序。真正需要写程序的来源,通常是没有现成路径的集成、标准报表视图做不出来的报表,或者行为超出编辑工具支持范围的内容。我们会逐项明确界定,并在需求应该被放弃而不是建起来的时候直接说。

想看 Drupal LMS 用你自己的内容跑起来?

给我们几份你真实在用的课程表单和一个 SCORM 封装。我们会围绕它们搭建一个示范环境——不是通用样本——让你判断真正的契合度。