我曾多次遇到这个问题,但始终找不到解决方案,只能解决问题。
假设我有多个10个工作,但根据给定的答案,验证规则是不同的。
foreach($jobs as $job){
if(!$this->Job->validates()){
echo 'Oh no, it didn't validate';
}
}
我发现的主要问题是,如果我设置了一个仅由第一个作业触发的规则。
if($this->data['Job']['type'] == 'special'){
$this->validator()->add('special_field', 'notEmpty', array(
'rule' => array('notEmpty'),
'message' => 'Please provide data'
));
}
它也适用于其他9个。因此,这些规则在调用之间是持久的。因此,如果规则存在,可以删除它。
if($this->data['Job']['type'] == 'special'){
$this->validator()->add('special_field', 'notEmpty', array(
'rule' => array('notEmpty'),
'message' => 'Please provide data'
));
}else{
$this->validator()->remove('special_field', 'notEmpty');
}
但是,如果规则在尝试删除时不存在,则会引发致命错误。
是否有任何方法可以在删除规则之前检查其是否存在,或者在beforeValidate开始时清除动态规则?
您可以使用ModelValidator::getField
方法获取字段的所有规则,并使用该方法检查是否存在特定规则。看见
有趣的问题。
我还没有测试过这个,但似乎可以使用:
$this->validator()->remove('special_field');
删除字段的所有规则。