最近負責一個項目,用了 Yii Framework 的 MVC 框架,剛開始自以為結構很穩健。
但是隨著對業務邏輯理解的深入,才開始意識到問題的嚴重性。
我錯誤地理解了MVC 中的Controller,想當然地根據以往的經驗,把所有的業務邏輯都放在Controller 的action
中去實作。
於是,每一個 Controller 的程式碼都上千行,越來越臃腫。
最後,我下定決心重構程式碼,起源是一個對外開放 API 介面的需求。
依照現在的架構,程式碼基本上無法重複使用,我需要把很多功能再重複寫一遍,這實在是無法接受。
物件導向程式不只是課本上的名詞啊!
真正開始實踐才發現,要有物件導向意識,有全局觀,是多麼難得的一件事情。
1 到底什麼是MVC
模型-視圖-控制器(MVC)是一種#設計框架(設計模式)。
MVC 的目標是將業務邏輯從使用者介面的考慮中分離。
這樣,開發者就可以更容易地改變每一部分而不會影響其他。
在MVC 中,
- Model 代表#資料和業務規則#;
- #View 包含了 使用者介面元素,例如文本,表單等;
- Controller 則管理模型和視圖中的通訊#。
MVC 在各種程式語言中均有實現,例如J2EE 應用開發中,
View 可能由jsp 實作;Controller 是servlet,現在一般用Struts 實作;Model則是由一個實體Bean 來實作。
2 我遇到了什麼問題
Yii Framework 是一個流行的PHP 框架,它藉鑒了Ruby on Rails 的ActiveRecord
(AR
) 概念。
資料庫中的每一個 table
都可以用 AR
類別來方便地進行增刪改查操作。
它把 AR 當做 Model,並推薦放在一個名為 models
的目錄下面。
於是,我在自動產生表對應的 AR 之後,便望文生義想當然地認為已經擁有了 Model 層。
其實,AR只不過是 DAO (資料存取層),並不是 Model 層。
我們的業務幾乎全放在了Controller 裡:對使用者提交上來的表單進行各種邏輯判斷,進行計算,實例化AR 對資料進行儲存…
因為一個Controller 中會有多個action
,每個action
都有這樣的業務處理。
最後,我發現我的 Controller 程式碼已經超過了 1000 行。
突然有一天,leader 說,我們這個系統要開放 API 給現有的舊系統調用,要給第三方介面。
第三方只是要給定一個參數,本系統給出個結果值而已,這其中的業務處理它是不關心的。
壞就壞在這裡,Controller 已經實現了那些業務,但它是接受表單提交的,怎麼能夠也接受 SOAP 的 xml 文件呢?
Controller 和套套一樣,應該越薄越好。
它的職責應該只是接受使用者的輸入,然後立刻轉發給別的類別來處理。
這樣 Controller 只負責提供不同的接口,我們才能算是將業務邏輯分離出去,而分離出去的業務也很容易進行重用。
分離出來的這部分業務由誰來處理呢?答案應該是 Model。
3 View的職責
View部分比較明確,就是負責顯示。
一切與顯示介面無關的東西,都不應該出現在view裡面。
因此,View 中一般#不應該出現複雜的判斷語句,以及複雜的運算過程。
可以有簡單的迴圈語句、格式化語句。例如,部落格首頁的文字清單就是一種循環。
對於PHP的網路應用而言,HTML是View中的主要內容。
View應該從不呼叫Model的寫方法。
也就是說,View只從Model讀取數據,但不改寫Model。
所以我們說,View和Model是老死不相往來的。
而且,View中不直接存取$_GET
和$_POST
,應該由Controller傳遞給View。
此外,View一般沒有任何準備資料處理的內容,如查詢資料庫等。
這些一般是放在Controller裡面,並以變數的形式傳給視圖。
也就是說,視圖裡面要用到的數據,就是一個變數#。
4 Model的職責
對於Model而言,最主要是保存和輸出訊息。
例如,Post類別必然有一個用來保存部落格文章標題的title
屬性,必然有一個刪除的操作,這都是Model的內容。
資料、行為、方法是Model的主要內容。
實際工作中,Model是MVC中程式碼量最大。
Model是邏輯最複雜的地方,因為所應用的業務邏輯也要在這裡表示。
注意將Model與Controller區分開。
Model是處理業務方面的邏輯,Controller只是簡單的協調Model和View之間的關係。
只要是跟業務有關的,就該放在Model裡面。
資料校驗、public常數和變數,都應該放在model層,
也就是說,有可能被重複使用的屬性或方法,都應該放在model層,一次定義,到處使用。
Model不應該存取request、session以及其他環境數據,這些應該由Controller注入。
好的設計,應該是胖Model,瘦Controller。
5 Controller的職責
對於Controller,主要是回應使用者請求,決定使用什麼視圖,需要準備什麼數據用來顯示。
因此,對於request
的存取程式碼,應該放在Controller裡面,例如$_GET
、$_POST
等。
Controller應該僅限於獲取用戶請求數據,不應該對數據有任何操作或預處理,這應該放在 Model 裡面。
對於資料的寫入操作,要呼叫Model類別的方法完成。
對於使用者請求的回應,要呼叫視圖渲染。
此外,一般不要有HTML程式碼等其他表現層的東西#,這應該是屬於View的內容。
6 啟示
Yii Framework 的官方文件中有這麼一段:
In a well-designed MVC application, controllers are often very thin, containing probably only a few dozen lines of code; while models are very fat, containing most of the code responsible for representing and manipulating the data.
簡言之,Rich Model is Better。
以上是實例講解MVC架構的意義及職責劃分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。