架構總覽
ThinkPHP應用基于MVC(模型-視(shi)圖-控制器)的(de)方式來(lai)組織。
MVC是一個設計模(mo)(mo)式,它(ta)強制性的(de)使應用程序的(de)輸(shu)(shu)入、處理(li)和輸(shu)(shu)出分開。使用MVC應用程序被分成三個核心部件:模(mo)(mo)型(xing)(M)、視圖(V)、控(kong)制器(C),它(ta)們(men)各自處理(li)自己的(de)任務。
5.0的(de)URL訪問受路由(you)決定,如果關閉路由(you)或者沒(mei)有匹配路由(you)的(de)情況下,則是基于:
//serverName/index.php(或者其它應用入口文件)/模塊/控制器/操作/參數/值…
下面的一些概念(nian)有必要做下了解,可能(neng)在后面的內容中經常會被提及(ji)。
入口文件
用戶請求的PHP文件,負責處理一個請求(注意,不一定是URL請求)的生命周期,最常見的入口文件就是index.php,有時候也會為了某些特殊的需求而增加新的入口文件,例如給后臺模塊單獨設置的一個入口文件admin.php或者一個控制器程序入口think都屬于入口文件。
應用
應用在ThinkPHP中是一個管理系統架構及生命周期的對象,由系統的 \think\App類完成,應用通常在入口文件中被調用和執行,具有相同的應用目錄(APP_PATH)的應(ying)用(yong)我們認(ren)為是(shi)同一個應(ying)用(yong),但一個應(ying)用(yong)可能存(cun)在多(duo)個入口文件。
應用具(ju)有自己獨立(li)的(de)配置(zhi)文件、公共(函數)文件。
模塊
一個典(dian)型的(de)應用是由多(duo)個模塊(kuai)組(zu)成的(de),這些模塊(kuai)通常都是應用目錄下面的(de)一個子目錄,每個模塊(kuai)都有(you)自(zi)己獨立的(de)配置文件(jian)(jian)、公共文件(jian)(jian)和類庫文件(jian)(jian)。
5.0支持(chi)單(dan)一模塊(kuai)架構設計,如(ru)果你的(de)應用下面只有一個模塊(kuai),那么這個模塊(kuai)的(de)子目錄可(ke)以(yi)省略,并且在應用配置文件中修(xiu)改:
'app_multi_module' => false,
控制器
每個模塊擁有獨立的MVC類(lei)庫及配置文件,一(yi)個(ge)模塊(kuai)下面有(you)多個(ge)控(kong)制(zhi)器負責響(xiang)應請求,而每個(ge)控(kong)制(zhi)器其實就(jiu)是(shi)一(yi)個(ge)獨立的控(kong)制(zhi)器類(lei)。
控制(zhi)器主(zhu)要負(fu)責請求的(de)(de)接收,并調(diao)用(yong)相關的(de)(de)模型處(chu)理,并最終通過(guo)視(shi)圖(tu)輸出(chu)。嚴格來說(shuo),控制(zhi)器不(bu)應該過(guo)多的(de)(de)介入業(ye)務(wu)邏(luo)輯(ji)處(chu)理。
事(shi)實上,5.0中控(kong)制器是可以(yi)被跳過(guo)的(de),通過(guo)路由我們可以(yi)直接把請求調度(du)到某(mou)個模型(xing)或者其他的(de)類進(jin)行處(chu)理。
5.0的控制器類比較靈活,可以無需繼(ji)承任何基礎類庫。
一個典型的Index控制器類如下:
namespace app\index\controller;
class Index
{
public function index()
{
return 'hello,ThinkPHP!';
}
}
操作
一(yi)(yi)個(ge)(ge)控(kong)制(zhi)器包含多個(ge)(ge)操作(方(fang)法),操作方(fang)法是一(yi)(yi)個(ge)(ge)URL訪(fang)問的最(zui)小單元。
下面是一個典型的Index控制器的操作方(fang)法(fa)定義,包含了兩個操作方(fang)法(fa):
namespace app\index\controller;
class Index
{
public function index()
{
return 'index';
}
public function hello($name)
{
return 'Hello,'.$name;
}
}
操作方法可以不使用任何參數,如果定義了一個非可選參數,則該參數必須通過用戶請求傳入,如果是URL請求,則通常是$_GET或者$_POST方式傳入。
模型
模型(xing)類(lei)通常完成(cheng)實際的業務邏輯和數據封裝,并返回(hui)和格式無關的數據。
模型類并不一定要訪問數據庫,而且在5.0的架構設計中,只有進行實際的數據庫查詢操作的時候,才會進行數據庫的連接,是真正的惰性連接。
ThinkPHP的(de)模型(xing)層支持多層設計(ji),你可以(yi)對(dui)模型(xing)層進(jin)行更細化的(de)設計(ji)和(he)分工(gong),例如把模型(xing)層分為邏(luo)輯層/服務層/事件層等(deng)(deng)等(deng)(deng)。
視圖
控制器調(diao)用模(mo)型類(lei)后(hou)返(fan)回的(de)數據通過視(shi)圖組裝成不(bu)同(tong)格式的(de)輸(shu)出。視(shi)圖根(gen)據不(bu)同(tong)的(de)需(xu)求,來決(jue)定調(diao)用模(mo)板引擎進行內容解析后(hou)輸(shu)出還是(shi)直(zhi)接(jie)輸(shu)出。
視圖通常(chang)會有(you)一系列(lie)的(de)模(mo)(mo)板文件對(dui)應不同的(de)控(kong)制器和操作方法,并(bing)且支(zhi)持動(dong)態設(she)置(zhi)模(mo)(mo)板目錄。
驅動
系統很多的(de)組件都采用驅(qu)動(dong)式(shi)設計(ji),從而可以更靈活的(de)擴展,驅(qu)動(dong)類的(de)位置默(mo)認(ren)是放入核心類庫目錄下面,也可以重(zhong)新(xin)定義驅(qu)動(dong)類庫的(de)命名空(kong)間而改變驅(qu)動(dong)的(de)文件位置。
行為
行為(Behavior)是在預先定義好的一個應用位置執行的一些操作。類似于AOP編程中的“切面”的概念,給某一個切面綁定相關行為就成了一種類AOP編程的(de)思想。所以,行為通(tong)常是(shi)和某(mou)個(ge)位置相關(guan),行為的(de)執行時(shi)間(jian)依(yi)賴于綁定到了哪個(ge)位置上(shang)。
要執(zhi)行(xing)行(xing)為,首先要在應(ying)用(yong)程序中進行(xing)行(xing)為偵聽,例(li)如:
// 在app_init位置偵聽行為
\think\Hook::listen('app_init');
然后對某個位(wei)置(zhi)進行(xing)行(xing)為綁定:
// 綁定行為到app_init位置
\think\Hook::add('app_init','\app\index\behavior\Test');
一個(ge)位(wei)置(zhi)上如果綁定(ding)了多個(ge)行(xing)為的,按照(zhao)綁定(ding)的順序依次執行(xing),除非遇到中斷。
命名空間
ThinkPHP采用了PHP的命名空間進行類庫文件的設計和規劃,并且符合PSR-4的自動加載規范。
