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)過index.php完成。

如何使前端控制器,能夠做到可以在 任意控制器類 的 任意動(dòng)作 一個(gè)前端控制器就夠了,所有功能都由該前端控制器來(lái)執(zhí)行!

邏輯上,區(qū)分開當(dāng)前應(yīng)該執(zhí)行那個(gè)控制器的那個(gè)方法動(dòng)作,通過請(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)示方式。
核心問題:確定當(dāng)前的位置

當(dāng)前位置(當(dāng)前工作目錄)確定,過程:
瀏覽器請(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ā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)求,通過錯(cuò)誤提示修改

類文件的自動(dòng)加載

類名與類文件地址關(guān)系如下:
其一:框架中所有的類,可以完全確定的類??蚣芤坏┒x好了,類確定了。
采用類名與文件位置映射表(速度快)
其二:應(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();
類文件地址映射表,定義在方法外沒保證定義一次,以為會(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容