2011-04-21 57 views
0

我正在使用CodeIgniter DataMapper ORM,但有些東西我不太明白。CodeIgniter DataMapper ORM如何知道要應用哪組驗證規則?

在此示例中,您可以看到在User模型類上定義了一些$validation規則。

裏面的login功能,你還可以看到,它調用$this->validate()->get()。當validation函數運行時,它應該從$validation檢查全部規則。

我不明白的是,對於登錄用的情況下,只有用戶名和密碼需要驗證,但你可以看到有無關,這種使用情況下,在例如其他的驗證規則。具體而言,在$validation上定義了confirm_password規則,並且該規則顯然僅用於更新用例,而不是登錄用例。

由於在示例中我沒有看到任何繞過這些不相關規則的代碼,因此DataMapper ORM如何知道這些不相關的規則可以在login函數中繞過?

非常感謝大家。

回答

1

的DataMapper的驗證方法忽略了場不是對象的部分規則。因此,confirm_password規則不會觸發,除非對象具有該字段名稱的屬性。

數據驗證規則應該是在模型中,而不是在控制,因爲它是唯一的入口點數據,並確保所有的數據進入數據庫驗證。它也回答DRY,你不想在每個使用該模型的控制器中定義驗證規則。

鑑於這一事實,這是簡單的定義額外的字段,可能是你的CRUD形式很好,讓這一切在一個地方的規則。

1

調用對象的validate()函數是應用驗證規則所需的全部。請注意,只要執行不帶參數的save()調用,就會自動運行驗證。您還可以使用對象當前字段值對對象運行或驗證() - > get()以獲取匹配記錄。

http://datamapper.wanwizard.eu/pages/validation.html

我想只是因爲驗證將運行使用的對象當前場,而「confirm_password」字段是一個「非數據庫表字段」。

+0

如果這是真的,它如何知道'confirm_password'規則應該運行更新用例? – bobo 2011-04-21 12:23:22

+0

更新實際上只是節省。您只需獲取一個對象,設置要更改的字段,然後再次運行save()。 – Matthew 2011-04-21 12:26:55

+0

是的,但是當用戶想要更新他的密碼時,DataMapper ORM應該檢查'confirm_password'規則,當'confirm_password'是非數據庫表字段時,DataMapper如何知道這個規則應該被考慮到,無論它是登錄用例或更新用例? – bobo 2011-04-21 12:52:32

2

也許溶液是使2種型號:一種是「登錄」(用於表的用戶),以及另一種是「寄存器」(也可用於表的用戶)。然後,當你想登錄時,只需使用用戶的登錄模式。我認爲這是模型的真正目的。 (你現在有2款2套的驗證)

1

對於登錄用form_validation library只有驗證username/password,爲registration可以使用DataMapper和你的模型添加一條規則confirm_password必須匹配password但不confirm_password添加required規則..應該這樣做