php - Yii - 错误中止验证

时间:2014-05-05 08:13:05

标签: php yii frameworks

在Yii框架中,即使验证失败,验证仍会继续。这对于向每个字段显示用户错误很有用(比如你必须填写field1和field2),但是如果用户在数据库中不存在,他会尝试检查数据库中的密码是否匹配(使用不存在的用户)。

在验证某个属性失败后,有没有办法中止验证?

我找到了this link,但我不想编辑框架类。我们公司的许多不同团队使用相同的框架文件夹。因此,如果我覆盖基类,那么有人可能会重新覆盖我的类(例如更新框架)。

是否还有其他方法,而不是从CValidator延伸并告诉其他验证者从新CValidator扩展?

我目前的想法是告诉Yii使用另一个类CValidator,但我找不到在哪里完成此任务。

我还可以导入一个名为CValidator的类,所以他会自动选择我的班级。但话说回来,我收到了一个错误,因为他试图重新宣布该课程。

或者有没有办法使用命名空间来解决这个问题?

1 个答案:

答案 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()也已更改,以便处理此