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=方法名
參數哪來的?生成連接地址時,已經生成好了,瀏覽器用戶只需要點擊操作即可!額外的,通常會有默認功能,默認的控制器和默認的動作。
將當前的控制器名 動作名,通常會選擇存儲在常量中的原因:
- 保證該次請求腳本周期內,當前的值不變。
- 每次請求由控制器和動作來決定執行哪個功能
使用,凡事需要使用當前控制器名,和當前動作名的地方,都是以上定義好的常量即可
路徑
相對路徑:相對于當前位置的路徑標示方式。
核心問題:確定當前的位置
當前位置(當前工作目錄)確定,過程:
瀏覽器請求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';
}
//規則加載
}