ThinkPHP 3.1 版本針對分組架構實現了兩項關鍵改進:每個分組支持獨立的空模塊(EmptyAction),以及公共 Action/Model 類優先從當前分組目錄加載。這兩項變更顯著增強了分組的隔離性與擴展靈活性,解決了 3.0 版本中分組共享空模塊、公共基類加載路徑固定的痛點。本文詳解實現原理、配置方式與遷移影響。
空模塊 EmptyAction 僅能放置在分組目錄外層(如 Lib/Action/EmptyAction.class.php),所有分組共用同一空模塊處理邏輯,無法針對不同分組(如前台/後台/API)定制 404 頁面或空操作響應。
每個分組目錄下均可定義獨立的 EmptyAction.class.php:
Lib/Action/Home/EmptyAction.class.php # Home分組空模塊 Lib/Action/Admin/EmptyAction.class.php # Admin分組空模塊 Lib/Action/Api/EmptyAction.class.php # Api分組空模塊
加載優先級:請求不存在的模塊/操作時,系統按順序查找:
EmptyActionLib/Action/EmptyAction.class.php)這意味著分組可完全自主定義空請求處理邏輯(如返回 JSON 404、記錄審計日志、重定向登錄頁等),互不干擾。
分組內控制器/模型繼承公共基類(如 CommonAction、BaseModel)時,基類必須放在分組外層公共目錄(Lib/Action/CommonAction.class.php),否則需手動 import() 導入,打破自動加載約定。
系統自動加載繼承類時,搜索順序調整為:
Lib/Action/Home/CommonAction.class.php)Lib/Action/CommonAction.class.php)實際效果:
Home/CommonAction 繼承 CommonAction),實現「分組級基類 → 項目級基類 → 框架基類」三層繼承鏈。import,完全兼容現有代碼,升級無感知。無需額外配置,升級至 3.1 後自動生效。存量項目遷移建議:
Lib/Action/CommonAction,分組特有邏輯下沉至 Lib/Action/{Group}/CommonAction。EmptyAction 中的分組判斷邏輯(if (GROUP_NAME == 'Admin'))拆分至各分組獨立文件。Runtime 目錄使類映射緩存重建。這兩項改進標誌著 ThinkPHP 分組機制從「扁平共享」向「分層隔離」演進:
Modules/{Group}/Action 物理隔離一脈相承。ThinkPHP 3.1 的分組改進雖代碼量小,但架構意義大:通過「優先當前分組目錄」的加載策略,以最小改動成本實現了分組級別的定制化能力。這是框架從「小項目快速開發」向「中大型應用工程化治理」邁進的關鍵一步,建議所有分組項目升級時重點驗證空模塊與基類繼承邏輯。