在 CakePHP 中重用自定义验证方法 2.x
Reusing custom validation methods in 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){...}
重用验证方法的正确方法是在 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
如果给定的 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){...}
重用验证方法的正确方法是在 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