[英]Forget server-side form validation with a good domain model?
我正在使用Zend Framework和jQuery開發MVC應用程序。 我的模型由三層組成:服務層,映射器,域模型。
到目前為止,我一直在努力進行輸入驗證 - 一些發生在客戶端上,一些發生在Zend表單中,一些發生在域模型中。 責任變得混亂,並且存在許多重復的邏輯。
在考慮之后,我看不出有什么理由不跳過任何Zend Form驗證。 我可以使用javascript驗證簡單的東西(包括正則表達式),並在需要時從服務器獲取其他數據(通過ajax)。 當表單通過驗證時,我會將其傳遞給服務器。
當然,我的域模型邏輯需要是全面的(復制客戶端上的所有內容),但是域模型還有什么,對吧?
我錯過了什么嗎? 有什么值得注意的嗎?
編輯:只是要明確,我不建議放棄服務器端驗證。 (我意識到這是必要的。)我建議如果我的域模型做到了,也沒有必要在表單中做到這一點。
不。任何人都可以修改您的客戶端Javascript並強制您的客戶端代碼提交他們想要提交的內容。 因此,您的服務器應采取不信任(未經驗證)客戶端發送的任何內容的態度。 客戶端驗證不存在安全性,也不存在保護數據完整性的問題。 僅存在客戶端驗證以改善用戶體驗。 通過客戶端驗證,您的網站可以告知用戶有關錯誤的信息,而無需進行服務器往返,從而降低用戶完成的任何任務的摩擦。
您的域名不是在“在客戶端上執行”后執行任何操作。
反之亦然:您在服務器上進行驗證,並在客戶端上進行驗證,以使您的用戶滿意。
首先,您應該確保您要驗證的內容應該首先在域模型上完成(可能在set()方法中)。
然后你可以(作為你的用戶的一個額外功能)也可以在客戶端上執行此操作,但它必須能夠在輸入期間為用戶提供更快的反饋。 絕不是替代品。 它永遠不會阻止用戶做一些使你的模型處於無效狀態的事情。
此外,當您使模型持久化時,您應始終檢查它是否處於有效狀態。 無效的內容會使其無效,因此您不應該保存它。 此外,當您對應用程序中的多個模型(實體)應用更改時,請確保執行事務,以驗證兩個模型並確保其中一個模型未保存在無效狀態。
這是Zend / php特有的問題嗎? 如果是,那么我的答案可能不適用。
您面臨的問題似乎是驗證邏輯的倍增。 因此,在服務器端,您只想在一個地方強調驗證,而它是域模型。 這是專業人士:
優點:
缺點:
目的:
通常我會通過創建一些負責驗證的特定類來進行驗證,而不是域模型。 我可以解決這兩個缺點,因為它可重用且靈活(我可以使用DraftValidator,PublishedValidator)。 驗證結果可能非常通用,例如具有錯誤消息和isValid
屬性。
Javascript驗證:
可以在javascript級別進行驗證,特別是向用戶提供響應式反饋,而不是等待服務器的請求/響應之旅。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.