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 Core | 11.x(LMS 支持 ^10.3 || ^11) |
| 语言 | PHP | 8.1+(开发环境跑 8.4) |
| 数据库 | MariaDB / MySQL | 参考环境为 11.4 |
| Web 服务器 | nginx + PHP-FPM | 或 Apache |
| CMS 层 | Drupal LMS | 1.2.4(稳定版,受安全公告保障) |
| 命令列 | Drush | 13.3+ |
| 依赖管理 | Composer | 2.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 Activity | lms_activity | 学员在课节内做的一件单一事情 |
| LMS Answer | lms_answer | 存储学员对某个 activity 的作答 |
| LMS Lesson | lms_lesson | 课程内的一个课节 |
| LMS Course Status | lms_course_status | 追踪学员在一门课程内的进度 |
| LMS Lesson Status | lms_lesson_status | 逐课节追踪完成状态 |
状态实体正是 Drupal LMS 把进度追踪做成建模层级概念的原因。进度是作为数据被记录,而不是从报表反推——因此一名学生三年的纪录可以直接查询,不需要任何供应商专属的导出格式。
activity 类型与它们的许可范围
activity 类型是 lms_activity 的各种组合。公开的类型集覆盖了相当广泛的评估范围:
select_single——单选题select_multiple——多选题true_false——对错题free_text——文字作答file_upload——文件提交webform——以 Webform 表单作为 activityxapi_tincan——xAPI/Tin Can activityno_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 git@github.com: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机制而非旧有的程序式做法。文章会交代如果日后由您团队维护客制代码,哪些开发体验差异是真正重要的。
我们大概需要多少客制开发?
通常是设置而非写程序。真正需要写程序的来源,通常是没有现成路径的集成、标准报表视图做不出来的报表,或者行为超出编辑工具支持范围的内容。我们会逐项明确界定,并在需求应该被放弃而不是建起来的时候直接说。