2010-08-28 32 views
6

我試圖驗證我的用戶模型數據,我遇到了這個問題。如何僅使用特定驗證集來驗證CakePHP中的數據?

說我有以下驗證規則,存儲在$驗證變量:

var $validate=array(
     "username" => array(
      "usernameCheckForRegister" => array(
       "rule" => ..., 
       "message" => ... 
      ), 
      "usernameCheckForLogin" => array(
       "rule" => ..., 
       "message" => ... 
      ) 
     ), 
     //rules for other fields 
    ); 

在UsersController控制器,I有兩個動作:寄存器()和登錄()。 問題是,如何使用usernameCheckForRegister規則驗證register()操作中的username字段,以及如何使用其他規則usernameCheckForLogin驗證login()操作中的username字段? CakePHP中是否有任何行爲或方法允許我在驗證時選擇應用於表單字段的哪組規則?

非常感謝您的幫助!

+0

我的問題將是爲什麼你想在登錄時驗證用戶名?登錄時,唯一需要回答的問題是「數據庫中是否存在使用此密碼的用戶名?」用戶名是否有效並不重要。如果不是,則登錄將失敗,因爲用戶名不存在。 – deceze 2010-08-30 03:44:55

+0

我想在登錄時驗證用戶名的原因是因爲我還使用了客戶端驗證,它會告訴用戶他是否已將用戶名字段留空。 – linkyndy 2010-08-30 08:15:11

+0

對不起,仍然沒有得到它。 :)通用的「無效登錄信息」消息應該足夠了,甚至可能會更好。 Cake模型驗證設置是爲了確保只有經過驗證的數據被保存到數據庫中。登錄時,您不會將任何內容保存到數據庫,因此您不應該使用驗證規則。如果您只是想警告用戶有關空白輸入的信息,請不要使用模型驗證規則。 – deceze 2010-08-30 08:26:39

回答

8

我想我碰到了適合我需求的解決方案。

http://bakery.cakephp.org/articles/view/multivalidatablebehavior-using-many-validation-rulesets-per-model

而是定義每個領域的一些規則,這種行爲意味着定義下,你定義的所有領域相關的規則數「一般」的規則。

所以,與其做:

var $validate=array(
    "username" => array(
     "usernameCheckForRegister" => array(
      "rule" => ..., 
      "message" => ... 
     ), 
     "usernameCheckForLogin" => array(
      "rule" => ..., 
      "message" => ... 
     ) 
    ), 
    //rules for other fields 
); 

你這樣做:

/** 
* Default validation ruleset 
*/ 
var $validate = array(
     'username' => /* rules */, 
     'password' => /* rules */, 
     'email' => /* rules */ 
    ); 

/** 
* Custom validation rulesets 
*/ 
var $validationSets = array(
    'register' => array(
     'username' => /* rules */, 
     'password' => /* rules */, 
     'email' => /* rules */, 
    ), 
    'login' => array(
     'username' => /* rules */, 
     'password' => /* rules */ 
    ) 
); 

然後在你的控制器,你驗證集之間進行切換這樣的:$this->User->setValidation('register');

即使你有多寫一點代碼,我覺得這個解決方案最適合我的需求

+0

如果這種類型的解決方案也存在bindig rule per action? – 2014-06-30 11:39:57

0

檢查manual

var $validate=array(
     "username" => array(
      "usernameCheckForRegister" => array(
       "rule" => ..., 
       "message" => ..., 
       "on" => "create" 
      ), 
      "usernameCheckForLogin" => array(
       "rule" => ..., 
       "message" => ..., 
       "on" => "update" 
      ) 
     ), 
     //rules for other fields 
    ); 

UPDATE:哦...我只是注意到,這似乎是不可能使用的登錄驗證規則,除非你在更新每次登錄嘗試的用戶。您可以修改login()方法來驗證用戶名。

+0

感謝您的回答。不過,我認爲這不是一個乾淨的解決方案。我寧願尋找像$ this-> useValidationRule(「usernameCheckForRegister」); – linkyndy 2010-08-29 08:17:31

0

一個笨重的解決方案,但我剛從未在控制器中使用的那些我沒有使用。可能會變得混亂,但是對於簡單的登錄/註冊它可以做到這一點。

unset($this->User->validate['username']['usernameCheckForRegister']); 
+0

該解決方案有效,但我更喜歡更靈活的東西,因爲我將使用許多驗證規則集。 – linkyndy 2010-09-12 13:24:07