2015-06-19 65 views
2

根據Yii2文檔,可以將驗證規則應用於隱式屬性(表字段)或用戶定義的屬性。Yii2:如何動態地將驗證規則添加到模型類中?

有沒有辦法爲動態添加到模型類的屬性創建驗證規則?

例如:

要有一個名爲「過濾器」模型類,並命名爲「類別」另一個模型類 - 類別,如筆記本電腦,掌上電腦,臺式機等。我可能需要使用觸控板區域作爲一個過濾器以筆記本類別和對角線長度作爲過濾器到掌上類別之一等等。因此,在任何情況下,過濾條件都會根據我選擇的類別而有所不同,我可能希望將其添加到模型類Filter並動態驗證,如果通過發佈加載成功。

+3

沒有人說'rules()'函數應該被編碼爲一個固定數組,根據許多條件來組裝它是完全可能的。如果你還想要前端驗證,它只會咬你,這是困難的。 – Blizz

+0

問題是如果我沒有爲動態添加的屬性聲明我的規則(),模型類字段沒有被填充。例如$ model-> load(yii - > $ app0-> request-> post())不會加載$ model變量,因爲load()調用setAttributes(),然後調用validate()方法,這會失敗,因爲沒有爲動態添加的屬性聲明規則。 –

+0

啊但這不一定是相關的規則。 'load'&'setAttributes'默認只接受'safe'屬性。你也可以簡單地重寫['safeAttributes()'](http://www.yiiframework.com/doc-2.0/yii-base-model.html#safeAttributes()-detail),而與驗證無關。 – Blizz

回答

2

您可以編寫rules()函數,根據場景和數據輸入構建一組驗證規則。這不是一個要求,這是一個固定的數組。不幸的是,這樣做會給你帶來前端的驗證問題(如果你需要的話),那裏的動態規則不能很好地工作。

從評論我收集,最大的問題似乎是屬性沒有加載到模型中。這主要是因爲load()setAttributes()只填充被認爲是safe的屬性。

有兩種方法來定義屬性爲安全:

  • 給它一個驗證規則(至少是safe
  • 得到它的safeAttributes()返回(通過重寫它的屬性列表)