一、什么是MVC
MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式,把軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
MVC模式的目的是實現一種動態的程序設計,使后續對程序的修改和擴展簡化,并且使程序某一部分的重復利用成為可能。除此之外,此模式通過對復雜度的簡化,使程序結構更加直觀。軟件系統通過對自身基本部份分離的同時也賦予了各個基本部分應有的功能。專業人員可以通過自身的專長分組:
(控制器Controller)- 負責轉發請求,對請求進行處理。
(視圖View) – 界面設計人員進行圖形界面設計。
(模型Model) – 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(可以實現具體的功能)。
模型(Model) “數據模型”(Model)用于封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法。“模型”有對數據直接訪問的權力,例如對數據庫的訪問。“模型”不依賴“視圖”和“控制器”,也就是說,模型不關心它會被如何顯示或是如何被操作。但是模型中數據的變化一般會通過一種刷新機制被公布。為了實現這種機制,那些用于監視此模型的視圖必須事先在此模型上注冊,從而,視圖可以了解在數據模型上發生的改變。
視圖(View) 視圖層能夠實現數據有目的的顯示(理論上,這不是必需的)。在視圖中一般沒有程序上的邏輯。為了實現視圖上的刷新功能,視圖需要訪問它監視的數據模型(Model),因此應該事先在被它監視的數據那里注冊。
控制器(Controller) 控制器起到不同層面間的組織作用,用于控制應用程序的流程。它處理事件并作出響應。“事件”包括用戶的行為和數據模型上的改變。
二、為什么要自己開發MVC框架
網絡上有大量優秀的MVC框架可供使用,本教程并不是為了開發一個全面的、終極的MVC框架解決方案,而是將它看作是一個很好的從內部學習php的機會,在此過程中,你將學習面向對象編程和設計模式,并學習到開放中的一些注意事項。
更重要的是,你可以完全控制你的框架,并將你的想法融入到你開發的框架中。雖然不一定是做好的,但是你可以按照你的方式去開發功能和模塊。
三、開始開發自己的MVC框架
在開始開發前,讓我們先來把項目建立好,假設我們建立的項目為hylm,那么接下來的第一步就是把目錄結構先設置好。雖然在這個教程中不會使用到上面的所有的目錄,但是為了以后程序的可拓展性,在一開始就把程序目錄設置好使非常必要的。下面就具體說說每個目錄的作用:
Application – 存放程序代碼
config – 存放程序配置或數據庫配置
db – 用來存放數據庫備份內容
library – 存放框架代碼
public – 存放靜態文件
scripts – 存放命令行工具
tmp – 存放臨時數據
在目錄設置好以后,我們接下來就要來頂一下一些代碼的規范:
MySQL的表名需小寫并采用復數形式,如items,cars
模塊名(Models)需首字母大寫,并采用單數模式,如Item,Car
控制器(Controllers)需首字母大寫,采用復數形式并在名稱中添加“Controller”,如ItemsController, CarsController
視圖(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文件,文件內容為:
這么做的主要原因有:可以使程序有一個單一的入口,將所有除靜態程序以外的程序都重定向到index.php上;可以用來生成利于seo的URL,想要更好的配置URL,后期可能會需要URL路由,這里先不做介紹了。做完上面的操作,就應該知道我們需要做什么了,沒錯!在public目錄下添加index.php文件,文件內容為:
注意上面的PHP代碼中,并沒有添加PHP結束符號”?>”,這么做的主要原因是:對于只包含PHP代碼的文件,結束標志(“?>”)最好不存在,PHP自身并不需要結束符號,不添加結束符號可以很大程度上防止末尾被添加額外的注入內容,讓程序更加安全。在index.php中,我們對library文件夾下的config.php發起了請求,那么config.php這個啟動文件中到底會包含哪些內容呢?
config.php涉及到的內容并不多,不過是一些基礎數據的一些設置,再來看看library下的共用文件shared.php應該怎么寫