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 [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機制而非舊有的程序式做法。文章會交代如果日後由您團隊維護客製程式碼,哪些開發體驗差異是真正重要的。
我們大概需要多少客製開發?
通常是設定而非寫程式。真正需要寫程式的來源,通常是沒有現成路徑的整合、標準報表視圖做不出來的報表,或者行為超出編輯工具支援範圍的內容。我們會逐項明確界定,並在需求應該被放棄而不是建起來的時候直接說。