Model-View-Controller (MVC) 架構模式詳解及 PHP 實現示例
核心要點
MVC 模式最初在 20 世紀 70 年代後期提出,是一種軟件架構模式,其基礎是將數據的展示與與數據交互的方法分開。理論上,一個完善的 MVC 系統應該允許前端開發人員和後端開發人員在同一系統上工作而不會相互干擾、共享或編輯任何一方正在處理的文件。儘管 MVC 最初是為個人計算設計的,但由於其強調關注點分離,以及間接地,可重用代碼,因此已被 Web 開發人員廣泛採用。這種模式鼓勵開發模塊化系統,允許開發人員快速更新、添加甚至刪除功能。在本文中,我將介紹 MVC 的基本原理,對該模式的定義進行概述,并快速介紹 MVC 在 PHP 中的示例。這篇文章絕對適合任何以前從未使用 MVC 進行編碼的人,或者那些想要復習以前 MVC 開發技能的人。
理解 MVC
該模式的名稱是其三個核心部分的組合:模型 (Model)、視圖 (View) 和控制器 (Controller)。完整正確的 MVC 模式的可視化表示如下所示:
該圖顯示了數據的單向流程佈局,數據如何在各個組件之間傳遞,以及各個組件之間如何工作。
模型 (Model)
模型是指在整體設計中使用的數據的永久存儲。它必須允許訪問要查看或收集和寫入的數據,並且是 MVC 模式中視圖組件和控制器組件之間的橋樑。模型的一個重要方面是它在技術上是“盲目”的——我的意思是模型與數據傳遞到視圖或控制器組件後發生的事情沒有連接或了解。它既不調用也不尋求其他部分的響應;它的唯一目的是將數據處理到其永久存儲中,或者查找和準備要傳遞給其他部分的數據。然而,模型不能簡單地概括為數據庫,或處理數據過程的另一個系統的網關。模型必須充當數據的看門人,不問任何問題,但接受所有請求。模型組件通常是 MVC 系統中最複雜的部分,也是整個系統的核心,因為如果沒有它,控制器和視圖之間就沒有連接。
視圖 (View)
視圖是查看從模型請求的數據並確定其最終輸出的地方。傳統上,在使用 MVC 構建的 Web 應用程序中,視圖是生成和顯示 HTML 的系統部分。視圖還會引髮用戶的反應,然後用戶繼續與控制器交互。一個基本的例子是由視圖生成的按鈕,用戶點擊該按鈕並在控制器中觸發一個操作。關於視圖組件,特別是使用 MVC 模式構建其應用程序的 Web 開發人員,存在一些誤解。例如,許多人誤以為視圖與模型沒有任何連接,並且視圖顯示的所有數據都是從控制器傳遞的。實際上,這種流程完全忽略了 MVC 模式背後的理論。 Fabio Cevasco 的文章《CakePHP 框架:你的第一次嘗試》展示了在 CakePHP 框架中對 MVC 的這種混淆方法,這是一個可用的許多非傳統 MVC PHP 框架的例子:
“需要注意的是,為了正確應用 MVC 架構,模型和視圖之間不能有交互:所有邏輯都由控制器處理”
此外,將視圖描述為模板文件是不准確的。然而,正如 Tom Butler 指出,這不是一個人的錯,而是許多開發人員犯的許多錯誤,導致開發人員學習 MVC 不正確。然後他們繼續錯誤地教育他人。視圖實際上遠不止是一個模板,但是現代 MVC 啟發的框架幾乎已經使視圖變得面目全非,以至於沒有人真正關心框架是否真正遵循正確的 MVC 模式。同樣重要的是要記住,視圖部分永遠不會從控制器接收數據。正如我在討論模型時提到的那樣,如果沒有中間的模型,視圖和控制器之間就沒有直接關係。
控制器 (Controller)
三元組的最後一個組件是控制器。它的工作是處理用戶輸入或提交的數據,並相應地更新模型。控制器的生命線是用戶;如果沒有用戶交互,控制器就沒有目的。它是用戶應該與之交互的模式的唯一部分。控制器可以簡單地概括為信息的收集器,然後將其傳遞給模型進行組織以進行存儲,並且不包含除收集輸入所需的邏輯之外的任何其他邏輯。控制器也只連接到單個視圖和單個模型,使其成為單向數據流系統,在每個數據交換點進行握手和簽字。重要的是要記住,只有當用戶首先與視圖交互時,控制器才會獲得執行任務的指令,並且每個控制器的功能都是由用戶與視圖的交互觸發的觸發器。開發人員最常犯的錯誤是將控制器誤認為是網關,並最終為其分配視圖應該承擔的功能和責任(這通常是同一個開發人員將視圖組件簡單地誤認為是模板的結果)。此外,一個常見的錯誤是為控制器提供功能,使其獨自負責從模型到視圖的數據壓縮、傳遞和處理,而在 MVC 模式中,這種關係應該保持在模型和視圖之間。
PHP 中的 MVC
可以使用基於 MVC 模式的架構編寫 PHP Web 應用程序。讓我們從一個簡單的例子開始:
<?php class Model { public $string; public function __construct() { $this->string = "MVC + PHP = Awesome!"; } }
<?php class View { private $model; private $controller; public function __construct($controller, $model) { $this->controller = $controller; $this->model = $model; } public function output() { return "<p>" . $this->model->string . "</p>"; } }
<?php class Controller { private $model; public function __construct($model) { $this->model = $model; } }
我們已經開始了一個項目,其中包含每個模式部分的一些非常基本的類。現在我們需要設置它們之間的關係:
<?php $model = new Model(); $controller = new Controller($model); $view = new View($controller, $model); echo $view->output();
正如您在上面的示例中看到的,我們沒有任何特定於控制器的功能,因為我們沒有為我們的應用程序定義任何用戶交互。視圖包含所有功能,因為該示例純粹用於顯示目的。現在讓我們擴展該示例以顯示如何向控制器添加功能,從而向應用程序添加交互性:
<?php class Model { public $string; public function __construct() { $this->string = "MVC + PHP = Awesome, click here!"; } public function updateString($newString) { $this->string = $newString; } }
<?php class View { private $model; private $controller; public function __construct($controller, $model) { $this->controller = $controller; $this->model = $model; } public function output() { return '<p><a href="https://www.php.cn/link/5ca1b0a18c411c3ebfc35c9dad7da921">' . $this->model->string . "</a></p>"; } }
<?php class Controller { private $model; public function __construct($model) { $this->model = $model; } public function clicked() { $this->model->updateString("Updated Data, thanks to MVC and PHP!"); } }
我們使用一些基本功能增強了應用程序。現在設置組件之間的關係如下所示:
<?php $model = new Model(); $controller = new Controller($model); $view = new View($controller, $model); if (isset($_GET['action']) && !empty($_GET['action'])) { $controller->{$_GET['action']}(); } echo $view->output();
運行代碼,當您點擊鏈接時,您將能夠看到字符串更改其數據。
結論
我們已經介紹了 MVC 模式背後的基本理論,並創建了一個非常基本的 MVC 應用程序,但是在我們進入任何細緻的功能之前,我們還有很長的路要走。在本系列的下一篇文章中,我們將介紹在嘗試在 PHP 的 Web 上創建真正的 MVC 應用程序時面臨的一些選擇。敬請期待! 圖片來自 Fotolia 本文的評論已關閉。關於 MVC 模式和 PHP 有問題嗎?為什麼不在我們的論壇上提問呢?
PHP MVC 模式的常見問題解答 (FAQ)
模型-視圖-控制器 (MVC) 模式是一種設計模式,它將應用程序分成三個相互關聯的組件。這種分離允許開發人員修改或更新一個組件而不影響其他組件。在 PHP 中,MVC 模式特別有用,因為它可以組織代碼,使其更易於維護和擴展。它還可以提高數據管理和用戶界面設計的效率。
在 PHP 中,MVC 模式通過將應用程序劃分為三個組件來工作。模型處理數據和業務邏輯,視圖管理用戶界面和數據的呈現,控制器處理用戶請求並相應地更新模型和視圖。這種關注點分離允許更有效地管理代碼並更容易進行調試。
在 PHP 項目中實現 MVC 模式包括為模型、視圖和控制器創建單獨的文件或類。模型將包含用於訪問和操作數據的函數,視圖將包含用於顯示數據的 HTML 和 PHP 代碼,控制器將包含用於處理用戶輸入和更新模型和視圖的函數。
有幾個流行的 PHP MVC 框架可以幫助您在項目中實現 MVC 模式。這些包括 Laravel、Symfony、CodeIgniter 和 CakePHP。這些框架提供了一種結構化且有效的方式來使用 MVC 模式構建 Web 應用程序。
使用 PHP MVC 框架提供了許多好處。它提供了一種組織代碼的結構化方式,使其更易於維護和擴展。它還為常見任務提供了內置函數和庫,從而減少了您需要編寫的代碼量。此外,MVC 框架通常包含安全功能,可以保護您的應用程序免受常見的 Web 漏洞攻擊。
在 PHP MVC 中,控制器充當模型和視圖之間的中介。當用戶發出請求時,控制器會解釋該請求並調用相應的模型函數來處理數據。然後,它會更新視圖以反映數據中的任何更改。
在 PHP MVC 中,用戶輸入通常由控制器處理。控制器接收用戶輸入,對其進行驗證,然後將其傳遞給模型進行處理。然後,模型更新數據並通知控制器,控制器又更新視圖。
在 PHP MVC 中,數據通過使用 PHP 和 HTML 代碼在視圖中顯示。控制器從模型中檢索數據並將其傳遞給視圖,然後視圖生成 HTML 來顯示數據。
在 PHP MVC 中,模型中的數據通過控制器調用的函數進行更新。這些函數可以包括創建、讀取、更新和刪除數據等操作。
確保您的 PHP MVC 應用程序安全涉及多個步驟。這些步驟包括驗證和清理用戶輸入,使用預準備語句或參數化查詢來防止 SQL 注入,以及使用 MVC 框架的內置安全功能。同樣重要的是,要使您的框架和任何依賴項保持最新,以防範已知的漏洞。
以上是PHP主| MVC模式和PHP,第1部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!