# MVC 模式 (Model–view–controller)
## 什麼是 MVC?
* 軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
[論文出處](https://web.archive.org/web/20100921030808/http://www.itu.dk/courses/VOP/E2005/VOP2005E/8_mvc_krasner_and_pope.pdf)
## MVC 架構
* 目的是實現一種動態的程式設計,便於後續對程式的修改和擴充簡化,並且使程式某一部分的程式碼可以重複利用。
- 例如:使用者希望能透過瀏覽器來收發電子郵件,還能手機來存取電子信箱,甚至能透過 MAC 查看等等,在MVC設計模式中,Model 回應使用者請求並返迴對應資料,View 負責格式化資料並把它們呈現給用戶,同一個 Model 可以被不同的 View 共享,所以大大提高了代碼的可重用性。
* 除此之外,此模式透過對複雜度的簡化,使程式結構更加直覺。
1. 控制器(Controller):負責轉發請求,對請求進行處理。
2. 視圖(View): 介面設計人員進行圖形介面設計。
3. 模型(Model): 程式設計師編寫程式應有的功能(實現演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實現具體的功能)。

舉例來說,在 MVC 模式中,當使用者會透過 APP 或 Web 介面來操作系統,在他按下一個按鈕或是觸發某一個動作時,這時候就會藉由Controller來將我們的Model進行狀態的改變,然後選擇對應的View來呈現UI的部分,這時候View會將剛剛被Controller修改過的Model呈現到使用者的面前。
簡單簡化後的流程:
1. User 透過介面發出請求。
2. Controller截獲使用者發出的請求。
3. Controller呼叫Model完成狀態的讀寫操作。
4. Controller把資料傳遞給View。
5. View渲染最終結果並呈獻給使用者。
* MVC需要經過良好的設計,才能將工作分割的相當完美,所以在早期MVC架構推廣相當不易,對於小型專案更是困難。對於小型專案的開發者來說,在建構與維護MVC的架構上必須花費很多的時間,所花費的成本遠大於小型專案的成本;而對於大型專案,雖然MVC的架構有利於後續的發展及維護,但因入門門檻高,導致許多專案打退堂鼓。
現今,由於MVC的架構及維護方式日趨簡易且一致, 因此逐漸成為開發主流方式之一。
* 優點:
1. 程式的結構更加直覺化。
2. 降低維護的複雜度,系統更加方便管理。
3. 關注點分離:在個別不同的部分,做各自的事情而互不影響結果。
* 假設你今天在處理使用者操作介面,那就專心的套版,將Controller傳回來的資料看要怎麼擺放
* 假設在處理資料流傳入的參數驗證,那就在Controller處理完,不用去管會不會影響到View的呈現
* 假設是跟資料庫的溝通,就在Model裡將它實作好,不需要擔心是否參數有空值或Null, 因為那些該是在Controller處理掉的。
4. 將程式的修改與功能擴充簡化,提高了程式的發展性,以利於團隊開發。
* 缺點:
1. 用於小型專案成本高
2. 要管理的文件增加
3. 事前須嚴謹的規劃系統架構
4. 增加了系統結構和實現的復雜性
## 開發自己的 MVC 模型
* 在PHP語言中,大多數的開發人員都是使用MVC模型去開發 Web,所以我們以PHP語言為基礎開Web Application,一方面練習PHP,一方面加深對MVC模型的核心理念的理解。
1. **把目錄結構設定好:**
1. 隨便先建立一個資料夾,命名專案名稱,ex: /phpMVC,在這資料夾下建立
- /application : 存放web應用程式目錄
- /framework : 存放框架檔案目錄
- /public : 存放所有的公共的靜態資源,比如HTML檔案,CSS檔案和jJS檔案。
- index.php : 網頁唯一入口檔案。

2. 在application資料夾下再建立下一層的目錄
- /config : 存放應用的配置檔案
- /controllers : 應用的控制器類
- /model : 應用的模型類
- /view : 應用的檢視檔案
- 在/controllers資料夾下,我們還需要建立兩個資料夾來分別處裡前後端作業,一個frontend,一個backend。
- 在view下也建立frontend和backend資料夾。

3. 回到/framework資料夾中,建立 4 個子目錄:
- /core-框架核心檔案目錄
- /database-資料庫目錄(比如資料庫啟動類)
- /helpers-輔助函式目錄
- /libraries-類庫目錄

4. 在/public資料夾,建立 4 個目錄
- /css-存放css檔案
- /images-存放圖片檔案
- /js-存放js檔案
- /uploads-存放上傳的檔案

**到這裡為止我們就建好 MVC 模型的目錄結構了!**
3. 待補充
* 待補充