在Yii框架中,即使验证失败,验证仍会继续。这对于向每个字段显示用户错误很有用(比如你必须填写field1和field2),但是如果用户在数据库中不存在,他会尝试检查数据库中的密码是否匹配(使用不存在的用户)。
在验证某个属性失败后,有没有办法中止验证?
我找到了this link,但我不想编辑框架类。我们公司的许多不同团队使用相同的框架文件夹。因此,如果我覆盖基类,那么有人可能会重新覆盖我的类(例如更新框架)。
是否还有其他方法,而不是从CValidator
延伸并告诉其他验证者从新CValidator
扩展?
我目前的想法是告诉Yii使用另一个类CValidator
,但我找不到在哪里完成此任务。
我还可以导入一个名为CValidator
的类,所以他会自动选择我的班级。但话说回来,我收到了一个错误,因为他试图重新宣布该课程。
或者有没有办法使用命名空间来解决这个问题?
答案 0 :(得分:1)
您可以像这样覆盖CActiveRecord的验证方法:
public function validate($attributes=null, $clearErrors=true)
{
if($clearErrors)
$this->clearErrors();
if($this->beforeValidate())
{
$breakableAttributes = $this->breakableAttributes();
foreach($this->getValidators() as $validator) {
$validator->validate($this,$attributes);
foreach ($breakableAttributes as $ba) {
if ($this->hasErrors($ba))
return false;
}
}
$this->afterValidate();
return !$this->hasErrors();
}
else
return false;
}
在获得第一次验证错误时返回false。
回答你的问题"但如果我只想中止对某些属性的验证?"
在这种情况下,我会做下一个:
在BaseModel除了覆盖validate()
方法之外,定义下一个:
abstract public function breakableAttributes()
{
return array();
}
并在某些模型中覆盖它,例如
public function breakableAttributes()
{
return array('email', 'username');
}
方法validate()
也已更改,以便处理此