ThinkPHP基于MVC(Model-View-Contro₹¥ller,模型-視(shì)圖-控制(zhì)器(qì)§¥>₩)模式,并且均支持多(duō)層(mult$§₩i-Layer)設計(jì)。
模型(Model)層
默認的(de)模型層由Model類構成,但(dàn)是(shì)随著(zhe)₽♥項目的(de)增大(dà)和(hé)業(yè)務體¥¥(tǐ)系的(de)複雜(zá)化(huà),單一(yī)的(de)模型 ♠¶層很(hěn)難解決要(yào)求,從(cóng)3. α≠1開(kāi)始推出了(le)多(duō)層Mo≈∏del的(de)支持,設計(jì)思路(lù)很(hěn)簡單,不(b←β∞Ωù)同的(de)模型層仍然都(dōu)繼承自σ™•(zì)系統的(de)Model類,但(dàn)是(shì)在目錄結構∑←和(hé)命名規範上(shàng)做(zuò)了(le)區(qū)分(♦'fēn)。
例如(rú)在某個(gè)項目設計(jì)中需要π÷(yào)區(qū)分(fēn)數(shù)據層、邏輯層、服務層等不(bù)↔✘∑同的(de)模型層,我們可(kě)以在模塊目錄下(xià)面創建Model、Logic和(hé)Service目錄,把對(duì)用(yòng)戶表的(de)×π≠α所有(yǒu)模型操作(zuò)分(fēn)成三層:
- 數(shù)據層:Model/UserModel 用(yδ₹òng)于定義數(shù)據相(xiàng)關的↓☆(de)自(zì)動驗證和(hé)自(zì)動完成"≠和(hé)數(shù)據存取接口
- 邏輯層:Logic/UserLogic 用(yòng)于定義用(§π yòng)戶相(xiàng)關的(de)業(yè✘§γ$)務邏輯
- 服務層:Service/UserService 用(yòng)于定義用(yò©δ ng)戶相(xiàng)關的(de)服務接口等
而這(zhè)三個(gè)模型操作(zuò)類統一(↕αβ≥yī)都(dōu)繼承Model類即可(kě ↑↔),例如(rú): 數(shù)據層:Home/Model/UserModel.class.£<€∞php
namespace Home\Model;use Think\Model;class UserModel extends Model{}
邏輯層:Home/Logic/UserLogic.cl♣ ±ass.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{}
這(zhè)樣區(qū)分(fēn)不(b™₩ù)同的(de)模型層之後對(duì)用(yòng)戶數(s≤<∞hù)據的(de)操作(zuò)就(jiù)非常清晰,在調用(yòσng)的(de)時(shí)候,我們也(yě)可(kě)¶¥'以用(yòng)內(nèi)置的(de)D方法很(hěn)方便的(deγλφ)調用(yòng):
D('User') //實例化(huà)UserModelD('User','Logic') //實例化(huà)UserLogicD('User','Service') //實例化(huà)UserService
默認的(de)模型層是(shì)Model,我們也(yěα≠)可(kě)以更改設置,例如(rú):
'DEFAULT_M_LAYER' => 'Logic', // 更改默認的(de)模型層名稱為(wèi)Lo₹←↔gic
更改之後,實例化(huà)的(de)時(shí)候需要(yà Ω o)改成:
D('User') //實例化(huà)UserLogicD('User','Model') //實例化(huà)UserModelD('User','Service') //實例化(huà)UserService
對(duì)模型層的(de)分(fēn)層劃分(fēn)是(shì)÷∑很(hěn)靈活的(de),開(kāi)發人(ré©₽n)員(yuán)可(kě)以根據項目的(de♥↓£Ω)需要(yào)自(zì)由定義和(hé)增加模型分(fēn)層↓£→",你(nǐ)也(yě)完全可(kě)以隻使用(yòng)Model層。
視(shì)圖(View)層
視(shì)圖層由模闆和(hé)模闆引擎組成,在模闆中可€₩(kě)以直接使用(yòng)PHP代碼,模闆引擎的(de)設計(₹ jì)會(huì)在後面講述,通(tōng)過驅動也(₽÷'§yě)可(kě)以支持其他(tā)第三方的(de)模闆引擎。視(shì)圖φ←的(de)多(duō)層可(kě)以簡單的(de)通(tōng)過目錄(也(y ↔ě)就(jiù)是(shì)模闆主題)區(qū)分(fēn),例如(rú)₩∏±♠:
View/default/User/add.htmlView/blue/User/add.html
複雜(zá)一(yī)點的(de)多(duō)層視(shì)圖還(háε÷i)可(kě)以更進一(yī)步,采用(yòng)不(bù)同的(de)視( ±"≈shì)圖目錄來(lái)完成,例如(rú):
view 普通(tōng)視(shì)圖層目錄mobile 手機(jī)端訪問(wèn)視(shì)圖層目錄
這(zhè)樣做(zuò)的(de)好(hǎo)處是(shì)每個(gè)不Ω♣₽(bù)同的(de)視(shì)圖層都(dōu)可(kě)以支持不(b¶≤'ù)同的(de)模闆主題功能(néng)。
默認的(de)視(shì)圖層是(shì)View目錄,我們'≤♣可(kě)以調整設置如(rú)下(xià):
'DEFAULT_V_LAYER' => 'Mobile', // 默認的(de)視(shì)圖層名稱更改為(wèi)Mobil↓↑×♠e
非默認視(shì)圖層目錄的(de)模闆獲取需要(yà€÷Ωo)使用(yòng)T函數(shù),後面會(huì)©'₽™講到(dào)。
控制(zhì)器(qì)(Controlle₹r)層
ThinkPHP的(de)控制(zhì)器(qì)層¥≥≥由核心控制(zhì)器(qì)和(hé)業(yè)務控制π(zhì)器(qì)組成,核心控制(zhì)器(qì)由系統內(✔ nèi)部的(de)App類完成,負責應用(yòngσ÷δ<)(包括模塊、控制(zhì)器(qì)和(hé)操作(zuò))的(dα₩e)調度控制(zhì), 包括HTTP請(qǐng)求攔<δ♣≥截和(hé)轉發、加載配置等。業(yè)務控制(zhì)器₹∑$(qì)則由用(yòng)戶定義的(de)控制(zhì)器(qì)類完成↓Ω'。多(duō)層業(yè)務控制(zhì∞β÷ )器(qì)的(de)實現(xiàn)原理(lǐ)和(hé)模型的(de)§®分(fēn)層類似,例如(rú)業(yè)務控制(zhì)器(q ↑βì)和(hé)事(shì)件(jiàn)控制(zhì) 器(qì♣®):
Controller/UserController //用(yòng)于用(yòng)戶的(de)業(yè)務邏輯控制(zλ≠hì)和(hé)調度Event/UserEvent //用(yòng)于用(yòng)戶的(de)事(shì)件(jiàn)♣δ↕§響應操作(zuò)
訪問(wèn)控制(zhì)器(qì) Home/Controller/UserCont☆←roller.class.php 定義如(rú)下(xià):
namespace Home\Controller;use Think\Controller;class UserController extends Controller{}
事(shì)件(jiàn)控制(zhì)器(qì) Home/Event/UserEvent.class.php 定義如(rú)下(xià):
namespace Home\Event;use Think\Controller;class UserEvent extends Controller{}
UserController負責外(wài)部交互響應,通(tōng)過URLΩ§請(qǐng)求響應,例如(rú) http://serverName/User/index,而 UserEvent 負責內(nèi)部的(de)事(shì)件(→←jiàn)響應,并且隻能(néng)在內(nèi)$✔¥部調用(yòng): A('User','Event');
默認的(de)訪問(wèn)控制(zhì)器(qì)層是(σ←♣'shì)Controller,我們可(kě)以調整設置如(r✘π γú)下(xià):
'DEFAULT_C_LAYER' => 'Event', // 默認的(de)控制(zhì)器(qì)層名稱改為(wèi)Even₹®♦×t
所以是(shì)和(hé)外(wài)部隔離(lí)的∞φ(de)。多(duō)層控制(zhì)器•™δ(qì)的(de)劃分(fēn)也(yě)不(bù)是(shì)強制(✘→£zhì)的(de),可(kě)以根據應用↑→Ω♦(yòng)的(de)需要(yào)自(zì♦↑¶♦)由分(fēn)層。控制(zhì)器(qì)分(fēn)層裡(lǐ)面可₽↑(kě)以根據需要(yào)調用(yòng)$< 分(fēn)層模型,也(yě)可(kě)以調用(yòng)不(bù↕♠€)同的(de)分(fēn)層視(shì)圖(主題)。
在MVC三層中,ThinkPHP并不(bùσ ↑↑)依賴M或者V,甚至可(kě)以隻有(yǒu¶γ≠§)C或者隻有(yǒu)V,這(zhè)個(gè)在Thin≤☆↔kPHP的(de)設計(jì)裡(lǐ)™β®↑面是(shì)一(yī)個(gè)很(hěn)重要(yào)的(de)用(yò∏§¥ng)戶體(tǐ)驗設計(jì),用(yòng)戶↕≥£<隻需要(yào)定義視(shì)圖,在沒有(yǒu)C的(de)情況下(x₽≤ià)也(yě)能(néng)自(zì)動識别。




