簡體   English   中英

使用良好的域模型忘記服務器端表單驗證?

[英]Forget server-side form validation with a good domain model?

我正在使用Zend Framework和jQuery開發MVC應用程序。 我的模型由三層組成:服務層,映射器,域模型。

到目前為止,我一直在努力進行輸入驗證 - 一些發生在客戶端上,一些發生在Zend表單中,一些發生在域模型中。 責任變得混亂,並且存在許多重復的邏輯。

在考慮之后,我看不出有什么理由不跳過任何Zend Form驗證。 我可以使用javascript驗證簡單的東西(包括正則表達式),並在需要時從服務器獲取其他數據(通過ajax)。 當表單通過驗證時,我會將其傳遞給服務器。

當然,我的域模型邏輯需要是全面的(復制客戶端上的所有內容),但是域模型還有什么,對吧?

我錯過了什么嗎? 有什么值得注意的嗎?

編輯:只是要明確,我不建議放棄服務器端驗證。 (我意識到這是必要的。)我建議如果我的域模型做到了,也沒有必要在表單中做到這一點。

不。任何人都可以修改您的客戶端Javascript並強制您的客戶端代碼提交他們想要提交的內容。 因此,您的服務器應采取不信任(未經驗證)客戶端發送的任何內容的態度。 客戶端驗證存在安全性,也不存在保護數據完整性的問題。 僅存在客戶端驗證以改善用戶體驗。 通過客戶端驗證,您的網站可以告知用戶有關錯誤的信息,而無需進行服務器往返,從而降低用戶完成的任何任務的摩擦。

您的域名不是在“在客戶端上執行”后執行任何操作。

反之亦然:您在服務器上進行驗證,並在客戶端上進行驗證,以使您的用戶滿意。

首先,您應該確保您要驗證的內容應該首先在域模型上完成(可能在set()方法中)。

然后你可以(作為你的用戶的一個額外功能)也可以在客戶端上執行此操作,但它必須能夠在輸入期間為用戶提供更快的反饋。 絕不是替代品。 它永遠不會阻止用戶做一些使你的模型處於無效狀態的事情。

此外,當您使模型持久化時,您應始終檢查它是否處於有效狀態。 無效的內容會使其無效,因此您不應該保存它。 此外,當您對應用程序中的多個模型(實體)應用更改時,請確保執行事務,以驗證兩個模型並確保其中一個模型未保存在無效狀態。

這是Zend / php特有的問題嗎? 如果是,那么我的答案可能不適用。

您面臨的問題似乎是驗證邏輯的倍增。 因此,在服務器端,您只想在一個地方強調驗證,而它是域模型。 這是專業人士:

優點:

  • 易於跟蹤,規則直接在您的域模型
  • 由於域模型具有驗證,因此訪問該對象的任何類都可以進行驗證
  • 當您的域模型發生變化時,更改驗證也更為自然

缺點:

  • 不,可重復使用。 特別是在具有繼承和接口的OOP處,驗證不能用於具有類似結構的其他域模型(可能是派生類)。 但是,這種情況可能不適用於php。
  • 非靈活的驗證邏輯。 對於不同狀態的同一對象,您將需要不同的驗證規則。 例如,如果要保存請求,則草稿的驗證將有所不同(可能有一些字段為空),已發布,可能已完成或已過時。

目的:

通常我會通過創建一些負責驗證的特定類來進行驗證,而不是域模型。 我可以解決這兩個缺點,因為它可重用且靈活(我可以使用DraftValidator,PublishedValidator)。 驗證結果可能非常通用,例如具有錯誤消息和isValid屬性。

Javascript驗證:

可以在javascript級別進行驗證,特別是向用戶提供響應式反饋,而不是等待服務器的請求/響應之旅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM