資料驗證究竟該放在model還是controller

徐銘佑
徐銘佑
Sep 4, 2018 · 3 min read

在MVC的架構裡,Model是資料抽象化的代表,所有的邏輯都應該放在Model裡,那資料驗證呢?

先說model不該做資料驗證的原因:

一、Model 並無法知道使用者情境

Model並不會直接與使用者互動,所以無法知道使用者在什麼情境下操作資料,例如Locale的不同,或是不同使用者權限等等,所以如果將資料驗證的功能都放在Model在需要考慮不同情境下的驗證,會導致Model過胖或者降低系統的擴展性。

二、錯誤反應越快越好

系統的反應速度是UX的關鍵,如果錯誤處理速度越快,使用者也會操作得更順利,如果將所有的資料驗證放在Model,很多時候要等前端的App發完request到後端的API後,等API的回應才能知道使用者的資料是否有錯誤,如果能在前端的APP完成驗證的,除了能快速回應錯誤訊息,還能少發一個request,降低後端伺服器的負擔。

三、Model 不與使用者互動

與使用者互動的主要任務是由Controller負責的,所以當資料驗證發生錯誤時,Model不該直接回傳錯誤訊息,因該由Controller來決定錯誤訊息,因為只有Controller會知道使用者的使用情境。

但Model真的不應該負責任何資料驗證嗎?

Model在資料驗證的部分主要負責的就是,資料的完整性,在資安完整性代表著這筆資料是否有被更改過,但其背後的涵義是,這筆資料是否可靠,是否Make Senses,那什麼叫做Make Senses呢?

比如說今天有一個記帳程式,有一個Account Model,這個Account有一個money的attribute,在Model中如何驗證money才適當?才符合完整性?

怎樣的money是make sense的?這樣去思考看看,答案就呼之欲出了。

驗證他是否大於零,對一個記帳來說,不應該出現負的金額,如果出現那就代表這筆資料無效,那問題來了,那是否要驗證money是否沒有小數點?答案是否。

因為不同的幣值會有不同的表示方式,如果是美金的話就可能會有小數點,所以在驗證money是否沒有小數點的驗證就要放在controller。

所以總結來說,如果是關於格式相關的驗證可以放在controller,但如果是會導致資料失去意義或者使資料無效的驗證就要放在model。

另外也有人提到如果將驗證放在controller可能會違背DRY的原則,但我想如果使用Form Object的話應該就能改善一些問題吧?

以上是個人淺見,歡迎提出任何問題討論討論。

參考資料

https://blog.afoolishmanifesto.com/posts/why-you-should-validate-in-your-controllers-and-not-your-models/

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade