结合CakePHP中的验证语法

时间:2013-03-19 15:39:59

标签: validation cakephp model cakephp-1.3

假设我有一个相当典型的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',
        );
    }
}

实现这一目标的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您使用的是2.2 check this

如果你使用的是旧版本(如果我理解你的问题),你太懒了,无法将相同的验证规则添加到多个字段,那么我会在模型的构造函数中动态添加它们。我不喜欢那个解决方案,我会坚持这个惯例。