重用CakePHP 2.x中的自定义验证方法

时间:2016-01-14 13:58:51

标签: validation cakephp model cakephp-2.x

如果给定的IP和子网将有效网络组合在一起,我想在几个模型中进行验证。

我为一个模型编写了这个自定义验证函数:

public function isValidNetwork($check=null){
    if(isset($this->data[$this->name]['ip']) && isset($this->data[$this->name]['subnet'])){
        $iph = new IpHandler();
        return $iph->isNetwork($this->data[$this->name]['ip'],$this->data[$this->name]['subnet']);
    }
    return false;
}

在其他模型中重复使用此功能的最佳做法是什么?也许将功能移到AppModel

但还有另外一个问题,即密钥并不总是一样的。

是否可以覆盖验证规则以仅传递必要的参数?例如:

'subnet' => array(
        'rule' => array('isValidNetwork','ip','subnet'),
        'required' => true,
        'message' => 'No valid network given'
    )

public function isValidNetwork($ip, $subnet){...}

1 个答案:

答案 0 :(得分:1)

重用验证方法的正确方法是在AppModel或自定义行为中实现它。

关于允许自定义验证方法验证不同的字段名称,Cookbook建议您使用extract_values()

此示例取自文档:

class Post extends AppModel {

    public $validate = array(
        'slug' => array(
            'rule' => 'alphaNumericDashUnderscore',
            'message' => 'Slug can only be letters,' .
                ' numbers, dash and underscore'
        )
    );

    public function alphaNumericDashUnderscore($check) {
        // $data array is passed using the form field name as the key
        // have to extract the value to make the function generic
        $value = array_values($check);
        $value = $value[0];

        return preg_match('|^[0-9a-zA-Z_-]*$|', $value);
    }
}

但我想你也可以使用额外的参数作为提取相关数据的关键。

$validation数组中:

'subnet' => array(
    'rule' => array('isValidNetwork','ip','subnet'),
    'required' => true,
    'message' => 'No valid network given'
)

在你的方法中:

public function isValidNetwork($check, $ipFieldName, $subnetFieldName){
    if(isset($this->data[$this->name][$ipFieldName]) && isset($this->data[$this->name][$subnetFieldName])){
        $iph = new IpHandler();
        return $iph->isNetwork($this->data[$this->name][$ipFieldName],$this->data[$this->name][$subnetFieldName]);
    }
    return false;
}

修改

如果您想使用一个额外参数,可以执行以下操作:

'ip' => array(
    'rule' => array('isValidNetwork','subnet'),
    'required' => true,
    'message' => 'No valid IP/network given'
)

您的自定义验证方法如下所示:

public function isValidNetwork($check, $subnetFieldName){
    list($ip) = array_values($check);

    if(!empty($ip)) && !empty($this->data[$this->name][$subnetFieldName])){
        $iph = new IpHandler();
        return $iph->isNetwork($ip,$this->data[$this->name][$subnetFieldName]);
    }
    return false;
}

请参阅Cookboox 2.x: Data Validation: Adding your own Validation Methods