如果给定的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){...}
答案 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