目前大家使用mvc開發框架的時候,對於用戶前端的用戶錄入性文字合法性檢測的時候,在用戶提交的時候,這個應該由c層來處理還是m層來處理?
不得不頂一下易偉的說法,我補充下我的理解,V為保證用戶體驗而做校驗,不至於讓用戶提交之後發現出錯了在回去改,C為保證數據本身的合法性而校驗(資料是否屬於該用戶,資料狀態改變是否符合邏輯要求),M為確保資料存在性而交易,資料都不存在,下面的都不用走了,肯定是異常了。
這個問題需要結合具體應用、具體語言、具體框架分析,甚至和團隊成員的風格、組成有關。
我個人傾向於M做校驗邏輯,拋異常,然後C捕捉並轉換為前端所需的格式輸出。這樣初期代碼可能囉嗦一點,但對邏輯完整性和後期擴充比較有利。
還有一種做法是在M和C中間建立一層所謂邏輯層,來處理校驗邏輯和部分業務邏輯
一般MVC框架中會根據業務處理增加一層service層,model做ORM映射或直接拋棄,寫個DAO,好了,現在來說下校驗到底在哪層裡面做,最正確的方法是控制器層C和服務層S都要做,因為隨著網站發展,肯定是需要將service單獨拎出來,做為公共的服務組件,進行遠程調用,所以如果你不在控制器層做校驗的話,今後有數據請求,你直接丟給公共的服務,如果數據有問題,然後再返回錯誤,這很明顯就浪費了一次網絡IO,所以如果你已經在控制器層面做好數據校驗了,當數據有誤,直接拋出異常,不需要再透過RPC取進行一次遠端呼叫了
這絕對要分情況看的:
Fat model, skinny controller.
鵝廠編碼有個原則:介面間互不信任。
不用任何框架自己寫的話應該屬於c層。但更多的框架傾向於放在m層裡面。
另外不要只在v層做輸入校驗,前端的東西很容易被繞過,有安全隱患。
每一層都要做,重點不同。
我們通常在MVC的C-M之間一定會再加一層Service層(不過也可以理解成是C或M的一部分),這一層是設計為與View和Controller解耦,可以獨立剝離出來給外部呼叫的(API)。
所以, 在View裡面,進行比較弱的單一值的合法性校驗, 在Controller裡面,做外部來的請求封包的合法性校驗和部分使用者介面權限校驗; 在Service裡面做嚴格的資料合法性校驗、業務邏輯約束校驗、使用者資料權限校驗; 在Model裡面做資料的物理合法性校驗。
如果題主使用過Python的Django或Flask這樣的框架的話,會發現還有一個Form類別。使用者內容驗證的邏輯,一般來說會放在Form類別裡面來做。因為有時候,我們可能需要根據不同的情況,針對同一個Data model做不同的驗證規則。當然Django也支援Model層的驗證。相對而言。 Form層來做這個,耦合度更低一點。
簡單的MVC一般會把FORM驗證做在model層上,而比較成熟的方案一般會把FORM分出來,以joomla為例,它有FORM層並整合到model層上,結構上是屬於model層,但功能的實現又似乎跟model層沒什麼關係。
其實合法性檢查也分本地和伺服器端。 例如輸入為空,是放在 V 層檢查;輸入的格式不對事放在 M 層來檢查。 如果要進一步檢查是否合格更是放在 M 層通過訪問伺服器來檢查。
不得不頂一下易偉的說法,我補充下我的理解,V為保證用戶體驗而做校驗,不至於讓用戶提交之後發現出錯了在回去改,C為保證數據本身的合法性而校驗(資料是否屬於該用戶,資料狀態改變是否符合邏輯要求),M為確保資料存在性而交易,資料都不存在,下面的都不用走了,肯定是異常了。
這個問題需要結合具體應用、具體語言、具體框架分析,甚至和團隊成員的風格、組成有關。
我個人傾向於M做校驗邏輯,拋異常,然後C捕捉並轉換為前端所需的格式輸出。這樣初期代碼可能囉嗦一點,但對邏輯完整性和後期擴充比較有利。
還有一種做法是在M和C中間建立一層所謂邏輯層,來處理校驗邏輯和部分業務邏輯
一般MVC框架中會根據業務處理增加一層service層,model做ORM映射或直接拋棄,寫個DAO,好了,現在來說下校驗到底在哪層裡面做,最正確的方法是控制器層C和服務層S都要做,因為隨著網站發展,肯定是需要將service單獨拎出來,做為公共的服務組件,進行遠程調用,所以如果你不在控制器層做校驗的話,今後有數據請求,你直接丟給公共的服務,如果數據有問題,然後再返回錯誤,這很明顯就浪費了一次網絡IO,所以如果你已經在控制器層面做好數據校驗了,當數據有誤,直接拋出異常,不需要再透過RPC取進行一次遠端呼叫了
這絕對要分情況看的:
Fat model, skinny controller.
鵝廠編碼有個原則:介面間互不信任。
不用任何框架自己寫的話應該屬於c層。但更多的框架傾向於放在m層裡面。
另外不要只在v層做輸入校驗,前端的東西很容易被繞過,有安全隱患。
每一層都要做,重點不同。
我們通常在MVC的C-M之間一定會再加一層Service層(不過也可以理解成是C或M的一部分),這一層是設計為與View和Controller解耦,可以獨立剝離出來給外部呼叫的(API)。
所以,
在View裡面,進行比較弱的單一值的合法性校驗,
在Controller裡面,做外部來的請求封包的合法性校驗和部分使用者介面權限校驗;
在Service裡面做嚴格的資料合法性校驗、業務邏輯約束校驗、使用者資料權限校驗;
在Model裡面做資料的物理合法性校驗。
如果題主使用過Python的Django或Flask這樣的框架的話,會發現還有一個Form類別。使用者內容驗證的邏輯,一般來說會放在Form類別裡面來做。因為有時候,我們可能需要根據不同的情況,針對同一個Data model做不同的驗證規則。當然Django也支援Model層的驗證。相對而言。 Form層來做這個,耦合度更低一點。
簡單的MVC一般會把FORM驗證做在model層上,而比較成熟的方案一般會把FORM分出來,以joomla為例,它有FORM層並整合到model層上,結構上是屬於model層,但功能的實現又似乎跟model層沒什麼關係。
其實合法性檢查也分本地和伺服器端。
例如輸入為空,是放在 V 層檢查;輸入的格式不對事放在 M 層來檢查。
如果要進一步檢查是否合格更是放在 M 層通過訪問伺服器來檢查。