19.MVC

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ǔ)在常量中的原因:

  1. 保證該次請(qǐng)求腳本周期內(nèi)掺冠,當(dāng)前的值不變沉馆。
  2. 每次請(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ī)則加載
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幌墓,一起剝皮案震驚了整個(gè)濱河市但壮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌常侣,老刑警劉巖蜡饵,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袭祟,居然都是意外死亡验残,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門巾乳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)您没,“玉大人,你說(shuō)我怎么就攤上這事胆绊“迸簦” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵压状,是天一觀的道長(zhǎng)仆抵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)种冬,這世上最難降的妖魔是什么镣丑? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮娱两,結(jié)果婚禮上莺匠,老公的妹妹穿的比我還像新娘。我一直安慰自己十兢,他們只是感情好趣竣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旱物,像睡著了一般遥缕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宵呛,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天单匣,我揣著相機(jī)與錄音,去河邊找鬼宝穗。 笑死封孙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讽营。 我是一名探鬼主播虎忌,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼橱鹏!你這毒婦竟也來(lái)了膜蠢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤莉兰,失蹤者是張志新(化名)和其女友劉穎挑围,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糖荒,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杉辙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捶朵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜘矢。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狂男,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出品腹,到底是詐尸還是另有隱情岖食,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布舞吭,位于F島的核電站泡垃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羡鸥。R本人自食惡果不足惜蔑穴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惧浴。 院中可真熱鬧存和,春花似錦、人聲如沸赶舆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芜茵。三九已至叙量,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間九串,已是汗流浹背绞佩。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猪钮,地道東北人品山。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像烤低,于是被迫代替她去往敵國(guó)和親肘交。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理扑馁,服務(wù)發(fā)現(xiàn)涯呻,斷路器,智...
    卡卡羅2017閱讀 134,660評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)腻要、插件复罐、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 在一件事里,你與我一起雄家。 每一個(gè)人的行為都是他自己獨(dú)特的作品效诅,風(fēng)格、思想都是他的,單一的存在也劃清了和周邊的界限乱投,...
    水木風(fēng)歌閱讀 297評(píng)論 0 0
  • 孩子已有21天沒(méi)摸琴了咽笼。今天與老婆散步的時(shí)候,因孩子學(xué)琴的事爭(zhēng)執(zhí)起來(lái)篡腌,最后也沒(méi)有達(dá)成一致的想法褐荷,我想放棄而老婆還是...
    杰克言JACKYAN閱讀 655評(píng)論 1 0