MVC
代碼的管理催跪,代碼級(jí)項(xiàng)目構(gòu)架锁蠕,依據(jù)代碼的類型(功能),將代碼分門別類的存儲(chǔ)在不同的文件中懊蒸。
目前比較主流的管理方式荣倾,依據(jù)代碼的功能,將代碼分成三大類骑丸,分別用M,V,C來(lái)表示舌仍,簡(jiǎn)稱為MVC項(xiàng)目架構(gòu)思想鳖孤。
M:model 模型
數(shù)據(jù)業(yè)務(wù)邏輯處理,會(huì)返回處理好的數(shù)據(jù) 可以暫且理解為從數(shù)據(jù)庫(kù)取出數(shù)據(jù)V:view 視圖
直觀的圖形界面c:controller 控制器
向系統(tǒng)發(fā)出指令的工具和幫手
mvc工作流程
請(qǐng)求->入口->控制器->模型->視圖->輸出
第一步 瀏覽者 調(diào)用控制器抡笼,對(duì)他發(fā)出指令
第二步 控制器 指令選取一個(gè)合適的模型
第三步 模型 按控制器指令取相應(yīng)數(shù)據(jù)
第四部 控制器 按指令選取相應(yīng)視圖
第五步 視圖 把第三步取到的數(shù)據(jù)按用戶想要的樣子顯示出來(lái)
必要的特點(diǎn):
瀏覽器僅僅會(huì)請(qǐng)求控制器苏揣,從控制器獲取相應(yīng)結(jié)果。意味著所有url地址都是請(qǐng)求某個(gè)c才可以
模型和視圖都被控制器調(diào)用
模型和視圖不需要完成任何的交互
通常一個(gè)表對(duì)應(yīng)一個(gè)模型
前端控制器(入口文件)
index.php推姻,用來(lái)實(shí)例化控制器對(duì)象平匈,并調(diào)用方法動(dòng)作的文件,稱之為:前端控制器藏古,負(fù)責(zé)分發(fā)參數(shù)增炭,也被成為請(qǐng)求分發(fā)器,將請(qǐng)求分發(fā)給某個(gè)控制器的動(dòng)作執(zhí)行機(jī)器拧晕。
還被稱之為入口文件隙姿,指定是只要該項(xiàng)目的功能,都需要經(jīng)過(guò)index.php完成厂捞。
如何使前端控制器输玷,能夠做到可以在 任意控制器類 的 任意動(dòng)作 一個(gè)前端控制器就夠了,所有功能都由該前端控制器來(lái)執(zhí)行靡馁!
邏輯上欲鹏,區(qū)分開當(dāng)前應(yīng)該執(zhí)行那個(gè)控制器的那個(gè)方法動(dòng)作,通過(guò)請(qǐng)求index.php時(shí)臭墨,向其傳遞get參數(shù)的方式完成:
例如:
index.php?c=控制器&a=方法名
參數(shù)哪來(lái)的赔嚎?生成連接地址時(shí),已經(jīng)生成好了胧弛,瀏覽器用戶只需要點(diǎn)擊操作即可尤误!額外的,通常會(huì)有默認(rèn)功能结缚,默認(rèn)的控制器和默認(rèn)的動(dòng)作损晤。
將當(dāng)前的控制器名 動(dòng)作名,通常會(huì)選擇存儲(chǔ)在常量中的原因:
- 保證該次請(qǐng)求腳本周期內(nèi)掺冠,當(dāng)前的值不變沉馆。
- 每次請(qǐng)求由控制器和動(dòng)作來(lái)決定執(zhí)行哪個(gè)功能
使用码党,凡事需要使用當(dāng)前控制器名德崭,和當(dāng)前動(dòng)作名的地方,都是以上定義好的常量即可
路徑
相對(duì)路徑:相對(duì)于當(dāng)前位置的路徑標(biāo)示方式揖盘。
核心問(wèn)題:確定當(dāng)前的位置
當(dāng)前位置(當(dāng)前工作目錄)確定眉厨,過(guò)程:
瀏覽器請(qǐng)求web服務(wù)器,web服務(wù)器交由php核心處理php腳本兽狭,當(dāng)php核心程序處理php腳本時(shí)憾股,需要確定當(dāng)前工作目錄(CWD current working drectort),就是當(dāng)前目錄鹿蜀,確定原則,php核心執(zhí)行的第一個(gè)執(zhí)行位置
當(dāng)前工作目錄服球,直到腳本周期結(jié)束茴恰,或者人為更改才會(huì)變更。意味著斩熊,常規(guī)的情況往枣, 當(dāng)前工作目錄,永遠(yuǎn)是url請(qǐng)求的腳本所在路徑粉渠,而不取決于分冈,載入哪個(gè)文件。
getcwd()獲取當(dāng)前工作目錄霸株。
自定義框架
基礎(chǔ)代碼(model,mysqldb)與功能(controller,matchmodel)相分離
- 基礎(chǔ)代碼:所有項(xiàng)目都可以使用雕沉,框架代碼。
- 功能代碼:具體實(shí)現(xiàn)當(dāng)前項(xiàng)目某個(gè)功能的代碼
框架去件、功能代碼分離
例:
app(功能代碼坡椒,應(yīng)用程序)
framework(基礎(chǔ)代碼,框架代碼)[工廠類尤溜,模型類肠牲,mysql數(shù)據(jù)庫(kù)類]
功能代碼模塊劃分,module
功能模塊靴跛,也叫平臺(tái)缀雳,控制器分組,指的是:功能大的集合
例:
前臺(tái)模塊和后臺(tái)模塊
app目錄中梢睛,劃分多個(gè)模塊
home肥印,admin,wechat绝葡,mobile深碱,debug,alpha藏畅,meta敷硅,test
比較特殊的 common(公共[配置,函數(shù)])
mvc的劃分
在模塊中劃分model愉阎,view绞蹦,controller中
mvc框架
例如時(shí)下比較流行的 thinkphp yii laravel
框架:基礎(chǔ)結(jié)構(gòu)和基礎(chǔ)代碼的集合,不包含業(yè)務(wù)邏輯的實(shí)現(xiàn)榜旦,基礎(chǔ)代碼可以用于任何業(yè)務(wù)邏輯中幽七。
mvc框架:采用框架實(shí)現(xiàn)功能時(shí),需要滿足mvc的代碼管理架構(gòu)思想溅呢,則該框架九尾mvc框架澡屡。(提供一定的功能以外猿挚,還需要有基礎(chǔ)的結(jié)構(gòu))
m 模型層的實(shí)現(xiàn)
典型的框架都會(huì)采用面向?qū)ο蟮乃枷腴_發(fā)
具體的某個(gè)模型,就是某個(gè)模型的實(shí)例(對(duì)象)
結(jié)構(gòu)如下:
每個(gè)數(shù)據(jù)庫(kù)中需要操作的數(shù)據(jù)表驶鹉,會(huì)對(duì)應(yīng)項(xiàng)目中的一個(gè)模型绩蜻。
需要操作多張表的情況,在主要數(shù)據(jù)對(duì)應(yīng)表中操作室埋。
基礎(chǔ)模型類 model-模型對(duì)象要實(shí)現(xiàn)單例化-工廠模式
c 控制器的實(shí)現(xiàn)
深度使用面向?qū)ο蟮乃枷?/p>
將一類相關(guān)的操作辜羊,封裝在一個(gè)控制器中,每個(gè)操作词顾,就是一個(gè)控制器方法八秃,稱之為動(dòng)作action
目前的做法,每個(gè)功能在一個(gè)控制器文件肉盹,例如 match_c team_c昔驱,該設(shè)計(jì)會(huì)帶來(lái)控制器文件過(guò)多(增刪改查),需要將相關(guān)的一系列功能上忍,整合到一個(gè)控制器文件中
index.php入口文件
通常會(huì)放在項(xiàng)目根目錄(documentroot)中骤肛,瀏覽器僅僅回去請(qǐng)求入口文件
/根目錄
|---app/應(yīng)用程序目錄
|---home/前臺(tái)
|---m/
|---v/
|---c/
|---admin/后臺(tái)
|---common/公共目錄
|---framework/框架基礎(chǔ)目錄
|---mysqlDb.class.php
|---factory.class.php
|---model.class.php
index.php入口文件
修改載入文件路徑-保證運(yùn)轉(zhuǎn)
http://localhost/index.php?module=home&controller=user&action=login&var=value
直接請(qǐng)求,通過(guò)錯(cuò)誤提示修改
類文件的自動(dòng)加載
類名與類文件地址關(guān)系如下:
其一:框架中所有的類窍蓝,可以完全確定的類腋颠。框架一旦定義好了吓笙,類確定了淑玫。
采用類名與文件位置映射表(速度快)
其二:應(yīng)用程序中app模型和控制器類,適應(yīng)不同功能而變化面睛。
采用固定規(guī)則進(jìn)行加載絮蒿。
模型類:Model結(jié)尾 在當(dāng)前模塊目錄中存儲(chǔ)
控制類:Controller結(jié)尾 在當(dāng)前模塊下controller子目錄,以類名.class.php結(jié)尾
編碼實(shí)現(xiàn):
index.php中叁鉴,定義自動(dòng)加載方法
//自動(dòng)加載實(shí)現(xiàn)
spl_auto_register('xxx');
$classlist = array();
類文件地址映射表土涝,定義在方法外沒(méi)保證定義一次,以為會(huì)被調(diào)用多次
function xxx($classname){
//映射加載
$classlist = $_GLBALS['classlist'];
if(isset($classlist[$classname])){
require $classlist[$classname]
}elseif('Model'==substr($classname,-5)){
require './app/'.MODULE.'/model/'.$classname.'Model.class.php';
}elseif('Controller'==substr($classname,-10)){
require './app/'.MODULE.'/controller/'.$classname.'Controller.class.php';
}
//規(guī)則加載
}