一、什麼是MVC
MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式,把軟件系統分爲三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
MVC模式的目的是實現一種動態的程序設計,使後續對程序的修改和擴展簡化,並且使程序某一部分的重複利用成爲可能。除此之外,此模式通過對複雜度的簡化,使程序結構更加直觀。軟件系統通過對自身基本部份分離的同時也賦予了各個基本部分應有的功能。專業人員可以通過自身的專長分組:
· (控制器Controller)- 負責轉發請求,對請求進行處理。
· (視圖View) – 界面設計人員進行圖形界面設計。
· (模型Model) – 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(可以實現具體的功能)。
模型(Model) “數據模型”(Model)用於封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法。“模型”有對數據直接訪問的權力,例如對數據庫的訪問。“模型”不依賴“視圖”和“控制器”,也就是說,模型不關心它會被如何顯示或是如何被操作。但是模型中數據的變化一般會通過一種刷新機制被公佈。爲了實現這種機制,那些用於監視此模型的視圖必須事先在此模型上註冊,從而,視圖可以瞭解在數據模型上發生的改變。
視圖(View) 視圖層能夠實現數據有目的的顯示(理論上,這不是必需的)。在視圖中一般沒有程序上的邏輯。爲了實現視圖上的刷新功能,視圖需要訪問它監視的數據模型(Model),因此應該事先在被它監視的數據那裏註冊。
控制器(Controller) 控制器起到不同層面間的組織作用,用於控制應用程序的流程。它處理事件並作出響應。“事件”包括用戶的行爲和數據模型上的改變。
二、爲什麼要自己開發MVC框架
網絡上有大量優秀的MVC框架可供使用,本教程並不是爲了開發一個全面的、終極的MVC框架解決方案,而是將它看作是一個很好的從內部學習PHP的機會,在此過程中,你將學習面向對象編程和設計模式,並學習到開放中的一些注意事項。
更重要的是,你可以完全控制你的框架,並將你的想法融入到你開發的框架中。雖然不一定是做好的,但是你可以按照你的方式去開發功能和模塊。
三、開始開發自己的MVC框架
在開始開發前,讓我們先來把項目建立好,假設我們建立的項目爲Kangframework,那麼接下來的第一步就是把目錄結構先設置好。
雖然在這個教程中不會使用到上面的所有的目錄,但是爲了以後程序的可拓展性,在一開始就把程序目錄設置好使非常必要的。下面就具體說說每個目錄的作用:
· application – 存放程序代碼
· config – 存放程序配置或數據庫配置
· db – 用來存放數據庫備份內容
· library – 存放框架代碼
· public – 存放靜態文件
· scripts – 存放命令行工具
· tmp – 存放臨時數據
在目錄設置好以後,我們接下來就要來頂一下一些代碼的規範:
1. MySQL的表名需小寫並採用複數形式,如items,cars
2. 模塊名(Models)需首字母大寫,並採用單數模式,如Item,Car
3. 控制器(Controllers)需首字母大寫,採用複數形式並在名稱中添加“Controller”,如ItemsController, CarsController
4. 視圖(Views)採用複數形式,並在後面添加行爲作爲文件,如:items/view.php, cars/buy.php
上述的一些規則是爲了能在程序鍾更好的進行互相的調用。接下來就開始真正的編碼了。
如圖所示:
第一步將所有的的請求都重定向到public目錄下,解決方案是在todo文件下添加一個.htaccesss文件,文件內容爲:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
如圖所示:
在我們把所有的請求都重定向到public目錄下以後,我們就需要將所有的數據請求都再重定向到public下的index.PHP文件,於是就需要在public文件夾下也新建一個.htaccess文件,文件內容爲:
<IfModule mod_rewrite.c>
RewriteEngine On
#如果文件存在就直接訪問目錄不進行RewriteRule
RewriteCond %{REQUEST_FILENAME} !-f
#如果目錄存在就直接訪問目錄不進行RewriteRule
RewriteCond %{REQUEST_FILENAME} !-d
#將所有其他URL重寫到 index.php/URL
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>
如圖所示:
這麼做的主要原因有:
1. 可以使程序有一個單一的入口,將所有除靜態程序以外的程序都重定向到index.php上;
2. 可以用來生成利於SEO的URL,想要更好的配置URL,後期可能會需要URL路由,這裏先不做介紹了。
下面操作請點擊:封裝MVC二