【问题标题】:php - Yii - Abort validation on errorphp - Yii - 出错时中止验证
【发布时间】:2014-05-05 08:13:05
【问题描述】:

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

有没有什么方法可以在某个属性验证失败后中止验证?

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

除了从CValidator 扩展并告诉其他验证器从新的CValidator 扩展之外,还有其他方法吗?

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

我也可以导入一个名为CValidator 的类,所以他会自动选择我的类。但话又说回来,我收到一个错误,因为他试图重新声明类。

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

【问题讨论】:

    标签: php yii frameworks


    【解决方案1】:

    您可以像这样覆盖 CActiveRecord 的 validate 方法:

    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() 也已更改以处理此问题

    【讨论】:

    • 我猜你的意思是CModels method. Nonetheless, where exactly would I put the new CActiveRecord`类?我知道如何实现 abortions 功能,但我不知道如何强制 Yii 采用我专门编写的类而不是内置类。
    • 将其放入您的模型目录并命名为 BaseModel 例如。并从这个类扩展你的所有模型
    • 也将其抽象化并从 CActiveRecord 扩展
    • 好的,现在我明白你的意思了,这实际上让我更进一步。但是如果我只想中止对某些属性的验证呢?
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2021-04-08
    • 2015-11-25
    相关资源
    最近更新 更多