隨著業務複雜度提升,單一 Model 層難以承載「資料存取、業務邏輯、對外服務」三種職責。ThinkPHP 3.2+ 原生支援多層目錄結構,讓開發者可按領域劃分層次。
在模組目錄下建立三個子目錄:
Model/ — 資料層:自動驗證、自動完成、CRUD 接口Logic/ — 邏輯層:業務規則、流程編排Service/ — 服務層:對外 API、第三方對接// Home/Model/UserModel.class.php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {}
// Home/Logic/UserLogic.class.php
namespace Home\Logic;
use Think\Model;
class UserLogic extends Model {}
// Home/Service/UserService.class.php
namespace Home\Service;
use Think\Model;
class UserService extends Model {}
D('User'); // 實例化 UserModel(預設層)
D('User', 'Logic'); // 實例化 UserLogic
D('User', 'Service');// 實例化 UserService
'DEFAULT_M_LAYER' => 'Logic', // 全域預設改為 Logic
// 之後 D('User') 將實例化 UserLogic
D('User', 'Model'); // 需顯式指定才能用 Model 層
通過目錄區分主題或終端類型:
View/default/User/add.html # PC 預設主題 View/blue/User/add.html # 藍色主題 View/mobile/User/add.html # 手機端主題
配置預設視圖層:
'DEFAULT_V_LAYER' => 'Mobile', // 預設使用 Mobile 目錄
Controller/ — 業務控制器:處理 HTTP 請求、頁面渲染Event/ — 事件控制器:內部事件響應,僅供 A('User','Event') 內部調用// Home/Controller/UserController.class.php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller {}
// Home/Event/UserEvent.class.php
namespace Home\Event;
use Think\Controller;
class UserEvent extends Controller {}
配置預設控制器層:
'DEFAULT_C_LAYER' => 'Event',
D('User','Service') 獲取資料,D('User','Logic') 處理業務$this->theme('blue')->display()Mobile 視圖層,配合檢測 User-Agent 自動切換ThinkPHP 多層 MVC 通過「目錄即命名空間、D/A 方法動態實例化」機制,以極低成本實現架構分層。核心在於按職責劃分目錄、按需調用層級,而非盡可能堆疊層次。