ThinkPHP基於MVC(Model-View-Controller,模型-視圖-控制器)模式,而且均支持多層(multi-Layer)設計。php
默認的模型層由Model類構成,可是隨着項目的增大和業務體系的複雜化,單一的模型層很難解決要求,ThinkPHP支持多層Model,設計思路很簡單,不一樣的模型層仍然都繼承自系統的Model類,可是在目錄結構和命名規範上作了區分。html
例如在某個項目設計中須要區分數據層、邏輯層、服務層等不一樣的模型層,咱們能夠在模塊目錄下面建立Model
、Logic
和Service
目錄,把對用戶表的全部模型操做分紅三層:函數
而這三個模型操做類統一都繼承Model類便可,例如:spa
數據層:設計
Home/Model/UserModel.class.php namespace Home\Model; use Think\Model; class UserModel extends Model{ }
邏輯層:code
Home/Logic/UserLogic.class.php namespace Home\Logic; use Think\Model; class UserLogic extends Model{ }
服務層:Home/Service/UserService.class.php
server
namespace Home\Service; use Think\Model; class UserService extends Model{ }
這樣區分不一樣的模型層以後對用戶數據的操做就很是清晰,在調用的時候,咱們也能夠用內置的D方法很方便的調用:htm
D('User') //實例化UserModel D('User','Logic') //實例化UserLogic D('User','Service') //實例化UserService
默認的模型層是Model,咱們也能夠更改設置,例如:blog
'DEFAULT_M_LAYER' => 'Logic', // 更改默認的模型層名稱爲Logic
更改以後,實例化的時候須要改爲:繼承
D('User') //實例化UserLogic D('User','Model') //實例化UserModel D('User','Service') //實例化UserService
對模型層的分層劃分是很靈活的,開發人員能夠根據項目的須要自由定義和增長模型分層,你也徹底能夠只使用Model層。
視圖層由模板和模板引擎組成,在模板中能夠直接使用PHP代碼,模板引擎的設計會在後面講述,經過驅動也能夠支持其餘第三方的模板引擎。視圖的多層能夠簡單的經過目錄(也就是模板主題)區分,例如:
View/default/User/add.html View/blue/User/add.html
複雜一點的多層視圖還能夠更進一步,採用不一樣的視圖目錄來完成,例如:
view 普通視圖層目錄 mobile 手機端訪問視圖層目錄
這樣作的好處是每一個不一樣的視圖層均可以支持不一樣的模板主題功能。
默認的視圖層是View目錄,咱們能夠調整設置以下:
'DEFAULT_V_LAYER' => 'Mobile', // 默認的視圖層名稱更改成Mobile
非默認視圖層目錄的模板獲取須要使用T函數,後面會講到。
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的狀況下也能自動識別。