假設一個Car
模型對象(如case class
),不可變且使用構建器模式創建。 (由Joshua Bloch製作的模式)。Play Framework 2 /冗餘對象驗證
其build
方法調用CarValidator
對象,以便允許創建或不相關的Car
。否則,它會拋出一個IllegalStateException
,其中包含意外的字段。
因此,在運行時,任何人都無法創建陳舊或無效的Car
,太棒了!
現在假設一個web表單創建一個Car
。 Play的控制器將含有這種形式的映射:
val carForm = Form( //this is a conceptual sample
mapping(
"brand" -> nonEmptyText,
"description" -> nonEmptyText,
"maxSpeed" -> number
"complexElement" -> number.verifying(........) //redundant validation here
)(Car.apply)(Car.unapply)
)
在這個例子中,有一些基礎領域,但想象的複雜領域,要求複雜的業務驗證喜歡這裏的complexeElement
。
我真的有這樣的感覺,我很容易打破幹(不要重複自己)。
事實上,無論表單驗證會帶來什麼結果,這將由我的Car
構建器的驗證器提供,因爲對模型的驗證是最重要的驗證位置,不應該依賴於其他任何內容。
我想象一下Helper
類的解決方案,該類接近我的Controller
,處理與構建器使用的相同驗證器對象。然而,它迫使我得到所有驗證方法public
,以便在我的Web表單的任何驗證步驟(如上面的代碼段中)獨立調用。
保持這個建設者的原則,同時避免打破DRY會是一個很好的做法嗎?
如果我沒有直接在映射中進行直接驗證,我怎麼能在映射表單時使用由Play提供的錯誤通知機制? – Mik378 2013-02-18 00:43:02
您可以使用Form'類的'withError'方法 – EECOLOR 2013-02-18 10:40:52
最後,我選擇在模型和表單之間共享一個Validator。這個驗證器返回一些'ValidationNEL'(從scalaz),我不得不將它們調整爲'Constraint',以便設置它們來驗證我的表單的方法。第一個建議的解決方案並不是最佳的,因爲有了它,我們永遠無法在一個步驟中顯示整個錯誤列表。 – Mik378 2013-02-21 21:32:54