19.MVC

MVC

代碼的管理,代碼級項目構架,依據代碼的類型(功能),將代碼分門別類的存儲在不同的文件中。

目前比較主流的管理方式,依據代碼的功能,將代碼分成三大類,分別用M,V,C來表示,簡稱為MVC項目架構思想。

  • M:model 模型
    數據業務邏輯處理,會返回處理好的數據 可以暫且理解為從數據庫取出數據

  • V:view 視圖
    直觀的圖形界面

  • c:controller 控制器
    向系統發出指令的工具和幫手

mvc工作流程

請求->入口->控制器->模型->視圖->輸出

第一步 瀏覽者 調用控制器,對他發出指令

第二步 控制器 指令選取一個合適的模型

第三步 模型 按控制器指令取相應數據

第四部 控制器 按指令選取相應視圖

第五步 視圖 把第三步取到的數據按用戶想要的樣子顯示出來

必要的特點:
瀏覽器僅僅會請求控制器,從控制器獲取相應結果。意味著所有url地址都是請求某個c才可以

  • 模型和視圖都被控制器調用

  • 模型和視圖不需要完成任何的交互

  • 通常一個表對應一個模型

前端控制器(入口文件)

index.php,用來實例化控制器對象,并調用方法動作的文件,稱之為:前端控制器,負責分發參數,也被成為請求分發器,將請求分發給某個控制器的動作執行機器。

還被稱之為入口文件,指定是只要該項目的功能,都需要經過index.php完成。

如何使前端控制器,能夠做到可以在 任意控制器類 的 任意動作 一個前端控制器就夠了,所有功能都由該前端控制器來執行!

邏輯上,區分開當前應該執行那個控制器的那個方法動作,通過請求index.php時,向其傳遞get參數的方式完成:

例如:
index.php?c=控制器&a=方法名

參數哪來的?生成連接地址時,已經生成好了,瀏覽器用戶只需要點擊操作即可!額外的,通常會有默認功能,默認的控制器和默認的動作。

將當前的控制器名 動作名,通常會選擇存儲在常量中的原因:

  1. 保證該次請求腳本周期內,當前的值不變。
  2. 每次請求由控制器和動作來決定執行哪個功能

使用,凡事需要使用當前控制器名,和當前動作名的地方,都是以上定義好的常量即可

路徑

相對路徑:相對于當前位置的路徑標示方式。
核心問題:確定當前的位置

當前位置(當前工作目錄)確定,過程:
瀏覽器請求web服務器,web服務器交由php核心處理php腳本,當php核心程序處理php腳本時,需要確定當前工作目錄(CWD current working drectort),就是當前目錄,確定原則,php核心執行的第一個執行位置
當前工作目錄,直到腳本周期結束,或者人為更改才會變更。意味著,常規的情況, 當前工作目錄,永遠是url請求的腳本所在路徑,而不取決于,載入哪個文件。

getcwd()獲取當前工作目錄。

自定義框架

基礎代碼(model,mysqldb)與功能(controller,matchmodel)相分離

  • 基礎代碼:所有項目都可以使用,框架代碼。
  • 功能代碼:具體實現當前項目某個功能的代碼

框架、功能代碼分離

例:
app(功能代碼,應用程序)
framework(基礎代碼,框架代碼)[工廠類,模型類,mysql數據庫類]

功能代碼模塊劃分,module
功能模塊,也叫平臺,控制器分組,指的是:功能大的集合
例:
前臺模塊和后臺模塊
app目錄中,劃分多個模塊
home,admin,wechat,mobile,debug,alpha,meta,test
比較特殊的 common(公共[配置,函數])

mvc的劃分

在模塊中劃分model,view,controller中

mvc框架

例如時下比較流行的 thinkphp yii laravel

框架:基礎結構和基礎代碼的集合,不包含業務邏輯的實現,基礎代碼可以用于任何業務邏輯中。

mvc框架:采用框架實現功能時,需要滿足mvc的代碼管理架構思想,則該框架九尾mvc框架。(提供一定的功能以外,還需要有基礎的結構)

m 模型層的實現

典型的框架都會采用面向對象的思想開發
具體的某個模型,就是某個模型的實例(對象)
結構如下:
每個數據庫中需要操作的數據表,會對應項目中的一個模型。

需要操作多張表的情況,在主要數據對應表中操作。

基礎模型類 model-模型對象要實現單例化-工廠模式

c 控制器的實現

深度使用面向對象的思想

將一類相關的操作,封裝在一個控制器中,每個操作,就是一個控制器方法,稱之為動作action

目前的做法,每個功能在一個控制器文件,例如 match_c team_c,該設計會帶來控制器文件過多(增刪改查),需要將相關的一系列功能,整合到一個控制器文件中

index.php入口文件

通常會放在項目根目錄(documentroot)中,瀏覽器僅僅回去請求入口文件

/根目錄
|---app/應用程序目錄
    |---home/前臺
        |---m/
        |---v/
        |---c/
    |---admin/后臺
    |---common/公共目錄
|---framework/框架基礎目錄
    |---mysqlDb.class.php
    |---factory.class.php
    |---model.class.php
index.php入口文件

修改載入文件路徑-保證運轉

http://localhost/index.php?module=home&controller=user&action=login&var=value

直接請求,通過錯誤提示修改

類文件的自動加載

類名與類文件地址關系如下:
其一:框架中所有的類,可以完全確定的類。框架一旦定義好了,類確定了。
采用類名與文件位置映射表(速度快)
其二:應用程序中app模型和控制器類,適應不同功能而變化。
采用固定規則進行加載。
模型類:Model結尾 在當前模塊目錄中存儲
控制類:Controller結尾 在當前模塊下controller子目錄,以類名.class.php結尾

編碼實現:

index.php中,定義自動加載方法
//自動加載實現
spl_auto_register('xxx');
$classlist = array();
類文件地址映射表,定義在方法外沒保證定義一次,以為會被調用多次
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';
    }
//規則加載
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,829評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,762評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,179評論 4 61
  • 在一件事里,你與我一起。 每一個人的行為都是他自己獨特的作品,風格、思想都是他的,單一的存在也劃清了和周邊的界限,...
    水木風歌閱讀 300評論 0 0
  • 孩子已有21天沒摸琴了。今天與老婆散步的時候,因孩子學琴的事爭執起來,最后也沒有達成一致的想法,我想放棄而老婆還是...
    杰克言JACKYAN閱讀 671評論 1 0