搜尋

首頁  >  問答  >  主體

在mvc開發框架中,對於使用者輸入的內容合法性檢查在提交時,由c完成還是m完成?

目前大家使用mvc開發框架的時候,對於用戶前端的用戶錄入性文字合法性檢測的時候,在用戶提交的時候,這個應該由c層來處理還是m層來處理?

phpcn_u1582phpcn_u15822747 天前1092

全部回覆(13)我來回復

  • 某草草

    某草草2017-05-16 17:08:31

    不得不頂一下易偉的說法,我補充下我的理解,V為保證用戶體驗而做校驗,不至於讓用戶提交之後發現出錯了在回去改,C為保證數據本身的合法性而校驗(資料是否屬於該用戶,資料狀態改變是否符合邏輯要求),M為確保資料存在性而交易,資料都不存在,下面的都不用走了,肯定是異常了。

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 17:08:31

    這個問題需要結合具體應用、具體語言、具體框架分析,甚至和團隊成員的風格、組成有關。

    我個人傾向於M做校驗邏輯,拋異常,然後C捕捉並轉換為前端所需的格式輸出。這樣初期代碼可能囉嗦一點,但對邏輯完整性和後期擴充比較有利。

    還有一種做法是在M和C中間建立一層所謂邏輯層,來處理校驗邏輯和部分業務邏輯

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-16 17:08:31

    一般MVC框架中會根據業務處理增加一層service層,model做ORM映射或直接拋棄,寫個DAO,好了,現在來說下校驗到底在哪層裡面做,最正確的方法是控制器層C和服務層S都要做,因為隨著網站發展,肯定是需要將service單獨拎出來,做為公共的服務組件,進行遠程調用,所以如果你不在控制器層做校驗的話,今後有數據請求,你直接丟給公共的服務,如果數據有問題,然後再返回錯誤,這很明顯就浪費了一次網絡IO,所以如果你已經在控制器層面做好數據校驗了,當數據有誤,直接拋出異常,不需要再透過RPC取進行一次遠端呼叫了

    回覆
    0
  • 習慣沉默

    習慣沉默2017-05-16 17:08:31

    這絕對要分情況看的:

    • 文字格式的合法性:在前端用js驗證或正規表示式處理掉就好。
    • 資料的有效性問題:

      • 簡單情況:例如驗證年月日的合法性,同樣可以放在前端來做。
      • 更廣泛的情況:包含以上兩種情況,也包含使用者名稱驗證、重複性驗證等,牽扯具體業務邏輯的情況,以Rails框架為代表,是放在Model中完成驗證的。

    Fat model, skinny controller.

    回覆
    0
  • 天蓬老师

    天蓬老师2017-05-16 17:08:31

    鵝廠編碼有個原則:介面間互不信任。

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-16 17:08:31

    不用任何框架自己寫的話應該屬於c層。但更多的框架傾向於放在m層裡面。

    另外不要只在v層做輸入校驗,前端的東西很容易被繞過,有安全隱患。

    回覆
    0
  • 阿神

    阿神2017-05-16 17:08:31

    每一層都要做,重點不同。

    我們通常在MVC的C-M之間一定會再加一層Service層(不過也可以理解成是C或M的一部分),這一層是設計為與View和Controller解耦,可以獨立剝離出來給外部呼叫的(API)。

    所以,
    在View裡面,進行比較弱的單一值的合法性校驗,
    在Controller裡面,做外部來的請求封包的合法性校驗和部分使用者介面權限校驗;
    在Service裡面做嚴格的資料合法性校驗、業務邏輯約束校驗、使用者資料權限校驗;
    在Model裡面做資料的物理合法性校驗。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-05-16 17:08:31

    如果題主使用過Python的Django或Flask這樣的框架的話,會發現還有一個Form類別。使用者內容驗證的邏輯,一般來說會放在Form類別裡面來做。因為有時候,我們可能需要根據不同的情況,針對同一個Data model做不同的驗證規則。當然Django也支援Model層的驗證。相對而言。 Form層來做這個,耦合度更低一點。

    回覆
    0
  • 習慣沉默

    習慣沉默2017-05-16 17:08:31

    簡單的MVC一般會把FORM驗證做在model層上,而比較成熟的方案一般會把FORM分出來,以joomla為例,它有FORM層並整合到model層上,結構上是屬於model層,但功能的實現又似乎跟model層沒什麼關係。

    回覆
    0
  • PHPz

    PHPz2017-05-16 17:08:31

    其實合法性檢查也分本地和伺服器端。
    例如輸入為空,是放在 V 層檢查;輸入的格式不對事放在 M 層來檢查。
    如果要進一步檢查是否合格更是放在 M 層通過訪問伺服器來檢查。

    回覆
    0
  • 取消回覆