2010-01-11 55 views
2

對於我的框架,我已經寫下了這個概念來解決表單驗證問題。我希望它對框架用戶儘可能直接。這是做表單驗證的好設計嗎?

每個窗體(=對象)都有一個或多個FormElements(=對象)。每個FormElement可以有0-n個FormValidators(=對象)。所有通過後端輕鬆配置的東西(簡單的拖動&刪除東西)。

當表單視圖呈現時,它循環遍歷所有FormElement,並且對於它們中的每一個,它遍歷所有關聯的FormValidator。這樣它就構建了所有需要的JavaScript來驗證客戶端的表單。

甲FormValidator是輕量級的對象限定僅這七個東西:驗證工具類的

  • PHP類名
  • 驗證工具類,它必須調用的
  • 方法名
  • 用於附加參數的字符串(逗號分隔值)

  • 驗證實用程序的JavaScript「class」名稱

  • 「方法」的名稱,其必須調用
  • 爲附加參數(逗號分隔值)

  • 其中包含一個格式化的錯誤信息

每個的相關聯ERRORINFO對象特林這些驗證方法將輸入數據作爲第一個參數輸入變量。這些方法中的每一個都只是檢查輸入是否符合某些規則,並返回TRUE或FALSE。

當提交表單時,一個FormDataManager創建和接收: - Form對象(所以它從那裏數據來自何處知道) - 輸入數據(通常爲$ _POST)

然後,它只是遍歷所有FormElements,檢查它們的所有FormValidators,如果有任何內容無效,它將重新加載傳遞錯誤消息數組的Form。如果一切正常,數據將被進一步處理(即存儲到db)。

這個設計有改進嗎?我錯過了什麼?

+0

我仍然認爲你應該上傳到谷歌代碼,sourceforge或git,這樣我們可以預覽你的框架。 – Gordon 2010-01-11 16:04:30

回答

3

我認爲你錯過了一個常見的驗證概念是驗證組。例如,您可能需要滿足以下情況之一:

  • 只有字段A具有任何值時,表格字段B纔是必填字段。
  • 只有字段A具有特定值時,表格字段B纔是必需的。
  • 只有字段A在特定範圍內(數字或日期),表單字段B纔是必需的。
  • 字段A或字段B需要有一個值(它們不能都是空的)。
  • 字段A或字段B需要有一個值(它們不能都是空的或都有值) - (XOR)。
  • 密碼和確認密碼字段必須相同。

而且我確定還有其他場景,其中驗證取決於其他表單元素的有效性或可選方面。另外 - 上述情況中的'強制性'也可能只是「適用」,這將再次成爲不同的情況。 這裏的典型(醫療系統)的例子是:「你是男性還是女性?」,後續的「你懷孕了嗎?」爲女性。或者AOP相關的問題,如果你有生日,並且只有65歲或以上纔有一定的後續問題。

這意味着您需要一些驗證組或驗證關聯對象,這些關聯對象包含這些依賴關係。

我猜你的設計意味着你也可以有FormValidator對象,這些對象不是直接鏈接到一個FormElement,而是FormElements的組合,並在觸發驗證之前包含一個條件檢查。

+0

另一個典型的例子是:註冊時密碼和重複密碼需要相同。 – 2010-01-11 16:03:18

+0

謝謝Josef - yep的確很常見!編輯。 – 2010-01-11 16:06:13

+0

謝謝Wim,我同意所有觀點。完全有意義。我稍微記得微軟Outlook或Outlook Express有一個類似的系統,具有非常強大的規則......比如「如果主題包含FOO或BAR或FOOBAR,並且文本以Hello,刪除電子郵件開始」。要知道如何做這樣的事情,非常通用。很酷的東西! – openfrog 2010-01-11 16:35:01

0

聽起來很有趣。我認爲你在正確的軌道上,特別是因爲它聽起來像你正在驗證客戶端和服務器端。

+0

除了驗證兩次之外,我看不出其他選擇;)客戶端用於可用性,服務器端用於安全。 – openfrog 2010-01-11 16:35:54

0

你應該做的一件事(在閱讀你的問題時我可能錯過了這一點)是確保驗證也發生在服務器上。這樣,即使有人使用javascript關閉或使用tinker,您的表單信息仍然得到驗證。