ThinkPHP 的獨立分組模式允許將大型應用拆分為多個獨立模組(如前台、後台、API),各自擁有完整的 MVC 結構。官方文件較簡略,本文整理實戰中踩過的坑與最佳實踐。
Application/
├── Common/ # 公共模組(共用函數、配置、模型)
├── Home/ # 前台模組
│ ├── Controller/
│ ├── Model/
│ └── View/
├── Admin/ # 後台模組
│ ├── Controller/
│ ├── Model/
│ └── View/
└── Api/ # API 模組
├── Controller/
└── Model/
關鍵差異:獨立分組的 Controller 直接放在 Controller/ 目錄下,不需要 額外的 Lib/ 層級(這點與普通分組不同,官方文件易誤導)。
直接使用 A()、D()、M() 跨模組調用常失敗(模型驗證失效、類找不到),原因是未自動載入目標模組的類檔案。
$user = A('Admin/User'); // 可能報錯或驗證失效
<?php
// 在需要調用的 Controller 中
import('Admin.Controller.UserController', APP_PATH); // 載入 Controller
import('Admin.Model.UserModel', APP_PATH); // 載入 Model(含自動驗證)
$UserCtrl = new \Admin\Controller\UserController();
$userData = [
'username' => $_POST['username'],
'email' => $_POST['email'],
'password' => md5($_POST['password']),
];
$result = $UserCtrl->register($userData); // 呼叫具體方法
在 Application/Common/Conf/config.php 設定:
<?php
return array(
'APP_GROUP_LIST' => 'Common,Home,Admin,Api', // 定義分組列表
'DEFAULT_GROUP' => 'Home', // 預設分組
'APP_GROUP_MODE' => 1, // 1=獨立分組
'APP_GROUP_PATH' => 'Modules', // 分組目錄名(可選)
);
| 問題 | 原因 | 解決 |
|---|---|---|
| 跨模組調用模型驗證失效 | 未載入 Model 類別 | 使用 import() 手動載入 Model |
| 類別找不到 | 命名空間或路徑錯誤 | 確認 import() 路徑與類別命名空間一致 |
| 模板輸出錯誤 | View 目錄結構不符 | 確認 View 目錄在對應模組下 |
| 路由無法識別模組 | URL 模式設定問題 | 設定 URL_MODEL 為 2 或 3,並配置路由規則 |
Common/BaseController)放在 Common/Controller/class UserController extends \Common\Controller\BaseController