假设我有一个相当典型的by-the-docs验证数组,我想保留这些规则并为8个以上的其他字段添加特定的验证规则。
原始$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 :(得分:0)
如果您使用的是2.2 check this。
如果你使用的是旧版本(如果我理解你的问题),你太懒了,无法将相同的验证规则添加到多个字段,那么我会在模型的构造函数中动态添加它们。我不喜欢那个解决方案,我会坚持这个惯例。