2013-03-19 69 views
1

假設我有一個相當典型的by-the-docs驗證數組,並且我想保留這些規則併爲其他8個字段添加特定的驗證規則。在CakePHP中結合驗證語法

原始$validate

var $validate = array( 
    'name' => array( 
     'notEmpty'=> array( 
      'rule' => 'notEmpty', 
      'message' => 'Name can not be blank.' 
     ), 
     'allowedCharacters'=> array( 
      'rule' => '|^[a-zA-Z ]*$|', 
      'message' => 'Name can only be letters.' 
     ), 
     'minLength'=> array( 
      'rule' => array('minLength', 3), 
      'message' => 'Name must be at least 3 characters long.' 
     ), 
     'maxLength'=> array( 
      'rule' => array('maxLength', 255), 
      'message' => 'Name can not be longer that 255 characters.' 
     ) 
    ), 
    'email' => array( 
     'email' => array( 
      'rule' => 'email', 
      'message' => 'Please provide a valid email address.' 
     ), 
     'isUnique' => array( 
      'rule' => 'isUnique', 
      'message' => 'This E-mail used by another user.' 
     ) 
    )   
); 

我可以添加以下規則來驗證陣列,但我不希望有重複8次。

////fragment of array 
    'field1' => array(
     'greaterThanField' => array(
      'rule' => array('greaterThanField', 'age'), 
      'message' => 'This field cannot be greater than age' 
     ) 
    ) 
//// 

function greaterThanField($field=array(), $compare_field=null){ 
    foreach($field as $key => $value){ 
     $v1 = $value; 
     $v2 = $this->data[$this->name][ $compare_field ];     
     if($v1 > $v2) { 
      return false; 
     } else { 
      continue; 
     } 
    } 
    return true; 
} 

我想添加一個字段名稱數組,這些字段名都將使用相同的規則和消息進行評估。我試圖創建在模型中的變量,然後在beforeValidate功能運行的代碼,但beforeValidate似乎並不具備進入compareFields變量

var $compareFields = array('field1', 'field2', 'field3', 'field4', 'field5', 'field6', 'field7', 'field8'); 

function beforeValidate(){ 
    foreach ($compareFields as $field) { 
     $validate[$field] = array(
      'rule'=> array('greaterThanField', 'age'), 
      'message'=>'Cannot exceed delivery age', 
     ); 
    } 
} 

什麼是實現這一目標的正確方法?

+0

通常'beforeValidate'或'__construct'被用於這個目的 - 因此這個問題的答案很好。注意,雖然你覆蓋了字段'$ field'的所有驗證規則,最好寫成'$ validate [$ field] ['greaterThanField'] =',這樣如果你稍後添加其他規則,你不會把它們擦掉用這個邏輯。 – AD7six 2013-03-20 01:08:54

+0

我將它從'$ compareFields'改爲'$ this-> compareFields'並開始工作。 – Damon 2013-03-20 15:24:08

+0

這個問題並不清楚 - 你的代碼不工作:) – AD7six 2013-03-20 22:05:50

回答

0

如果您使用2.2然後check this

如果您使用的是舊版本,並且(如果我正確理解了您的問題),您太懶惰以至於無法將相同的驗證規則添加到多個字段,那麼我會將它們動態添加到模型的構造函數中。儘管我不喜歡這個解決方案,但我會堅持這個習俗。