ThinkPHP基于MVC(Model-View-Controller,模型-視圖-控制器)模式,并且均支持多層(multi-Layer)設計。
## 模型(Model)層
默認的模型層由Model類構成,但是隨著項目的增大和業務體系的復雜化,單一的模型層很難解決要求,ThinkPHP支持多層Model,設計思路很簡單,不同的模型層仍然都繼承自系統的Model類,但是在目錄結構和命名規范上做了區分。
例如在某個項目設計中需要區分數據層、邏輯層、服務層等不同的模型層,我們可以在模塊目錄下面創建`Model`、`Logic`和`Service`目錄,把對用戶表的所有模型操作分成三層:
1. 數據層:Model/UserModel 用于定義數據相關的自動驗證和自動完成和數據存取接口
2. 邏輯層:Logic/UserLogic 用于定義用戶相關的業務邏輯
3. 服務層:Service/UserService 用于定義用戶相關的服務接口等
而這三個模型操作類統一都繼承Model類即可,例如:
數據層:`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方法很方便的調用:
~~~
D('User') //實例化UserModel
D('User','Logic') //實例化UserLogic
D('User','Service') //實例化UserService
~~~
默認的模型層是Model,我們也可以更改設置,例如:
~~~
'DEFAULT_M_LAYER' => 'Logic', // 更改默認的模型層名稱為Logic
~~~
更改之后,實例化的時候需要改成:
~~~
D('User') //實例化UserLogic
D('User','Model') //實例化UserModel
D('User','Service') //實例化UserService
~~~
> 對模型層的分層劃分是很靈活的,開發人員可以根據項目的需要自由定義和增加模型分層,你也完全可以只使用Model層。
## 視圖(View)層
視圖層由模板和模板引擎組成,在模板中可以直接使用PHP代碼,模板引擎的設計會在后面講述,通過驅動也可以支持其他第三方的模板引擎。視圖的多層可以簡單的通過目錄(也就是模板主題)區分,例如:
~~~
View/default/User/add.html
View/blue/User/add.html
~~~
復雜一點的多層視圖還可以更進一步,采用不同的視圖目錄來完成,例如:
~~~
view 普通視圖層目錄
mobile 手機端訪問視圖層目錄
~~~
這樣做的好處是每個不同的視圖層都可以支持不同的模板主題功能。
默認的視圖層是View目錄,我們可以調整設置如下:
~~~
'DEFAULT_V_LAYER' => 'Mobile', // 默認的視圖層名稱更改為Mobile
~~~
> 非默認視圖層目錄的模板獲取需要使用T函數,后面會講到。
## 控制器(Controller)層
ThinkPHP的控制器層由**核心控制器**和**業務控制器**組成,核心控制器由系統內部的App類完成,負責應用(包括模塊、控制器和操作)的調度控制,包括HTTP請求攔截和轉發、加載配置等。業務控制器則由用戶定義的控制器類完成。多層業務控制器的實現原理和模型的分層類似,例如業務控制器和事件控制器:
~~~
Controller/UserController //用于用戶的業務邏輯控制和調度
Event/UserEvent //用于用戶的事件響應操作
~~~
訪問控制器 `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{
}
~~~
UserController負責外部交互響應,通過URL請求響應,例如 `http://serverName/User/index`,而 `UserEvent `負責內部的事件響應,并且只能在內部調用:
~~~
A('User','Event');
~~~
默認的訪問控制器層是Controller,我們可以調整設置如下:
~~~
'DEFAULT_C_LAYER' => 'Event', // 默認的控制器層名稱改為Event
~~~
所以是和外部隔離的。
多層控制器的劃分也不是強制的,可以根據應用的需要自由分層。控制器分層里面可以根據需要調用分層模型,也可以調用不同的分層視圖(主題)。
> 在MVC三層中,ThinkPHP并不依賴M或者V,甚至可以只有C或者只有V,這個在ThinkPHP的設計里面是一個很重要的用戶體驗設計,用戶只需要定義視圖,在沒有C的情況下也能自動識別。
- 序言
- 基礎
- 獲取ThinkPHP
- 環境要求
- 目錄結構
- 入口文件
- 自動生成
- 模塊
- 控制器
- 開發規范
- 配置
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 擴展配置
- 批量配置
- 架構
- 模塊化設計
- URL模式
- 多層MVC
- CBD模式
- 命名空間
- 自動加載
- 應用模式
- 項目編譯
- 系統流程
- 路由
- 路由定義
- 規則路由
- 正則路由
- 靜態路由
- 閉包支持
- 實例說明
- 控制器
- 控制器定義
- 前置和后置操作
- Action參數綁定
- 偽靜態
- URL大小寫
- URL生成
- AJAX返回
- 跳轉和重定向
- 輸入變量
- 請求類型
- 空操作
- 空控制器
- 插件控制器
- 操作綁定到類
- 模型
- 模型定義
- 模型實例化
- 字段定義
- 連接數據庫
- 切換數據庫
- 分布式數據庫支持
- 連貫操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- USING
- fetchSql
- TOKEN
- STRICT
- INDEX
- 命名范圍
- CURD操作
- 數據創建
- 數據寫入
- 數據讀取
- 數據更新
- 數據刪除
- ActiveRecord
- 字段映射
- 查詢語言
- 查詢方式
- 表達式查詢
- 快捷查詢
- 區間查詢
- 組合查詢
- 統計查詢
- SQL查詢
- 動態查詢
- 子查詢
- 自動驗證
- 自動完成
- 參數綁定
- 虛擬模型
- 模型分層
- 視圖模型
- 關聯模型
- 高級模型
- Mongo模型
- 視圖
- 模板定義
- 模板主題
- 模板賦值
- 模板渲染
- 獲取模板地址
- 獲取內容
- 模板引擎
- 模板
- 變量輸出
- 系統變量
- 使用函數
- 默認值輸出
- 使用運算符
- 標簽庫
- 模板繼承
- 修改定界符
- 三元運算
- 包含文件
- 內置標簽
- Volist標簽
- Foreach標簽
- For標簽
- Switch標簽
- 比較標簽
- 范圍判斷標簽
- IF標簽
- Present標簽
- Empty標簽
- Defined標簽
- Assign標簽
- Define標簽
- 標簽嵌套
- import標簽
- 使用PHP代碼
- 原樣輸出
- 模板注釋
- 模板布局
- 模板替換
- 調試
- 調試模式
- 異常處理
- 日志記錄
- 頁面Trace
- Trace方法
- 變量調試
- 性能調試
- 錯誤調試
- 模型調試
- 緩存
- 數據緩存
- 快速緩存
- 查詢緩存
- 靜態緩存
- 安全
- 輸入過濾
- 表單合法性檢測
- 表單令牌
- 防止SQL注入
- 目錄安全文件
- 保護模板文件
- 上傳安全
- 防止XSS攻擊
- 其他安全建議
- 擴展
- 類庫擴展
- 驅動擴展
- 緩存驅動
- 數據庫驅動
- 日志驅動
- Session驅動
- 存儲驅動
- 模板引擎驅動
- 標簽庫驅動
- 行為擴展
- 標簽擴展
- Widget擴展
- 應用模式
- 部署
- PATH_INFO支持
- URL重寫
- 模塊部署
- 域名部署
- 入口綁定
- 替換入口
- 專題
- SESSION支持
- Cookie支持
- 多語言支持
- 數據分頁
- 文件上傳
- 驗證碼
- 圖像處理
- RESTFul
- RPC
- SAE
- IP獲取和定位
- 附錄
- 常量參考
- 配置參考
- 升級指導
- 鳴謝