Yii2教你三种Model(AR)中自定义验证规则的方法

阅读 456
收藏 2
2017-07-05
原文链接:t.cn

各位Yii2兄弟都知道Model的rules里面可以使用自己定义的验证规则,我们今天就把自定义规则做一个总结,进行一次彻底的知识归纳。

和以往一样,先列目录。

  1. 匿名函数形式
  2. 类的公共方法形式
  3. 自己建立验证类形式

提前准备

在User模型(User.php)里,我们想对一个字段username进行自定义验证,当username的值为abei的时候通过,否则提示“不是abei,不能通过。”

匿名函数形式

public function rules(){
    return [
        ["username",function($attr,$params){
            if($this->$attr == 'abei'){
                return true;
            }else{
                $this->addError("username","不是abei,不能通过。");
            }
        }],
    ];
}

我想你看明白了吧,很简单,直接将验证的逻辑写到一个匿名函数中和username对应上即可。这里的关键词是$this->addError,要记住。$attr代表当前被验证的字段,即username.

go on.

类的公共方法

public function rules(){
    return [
        ["username","checkAbei"],
    ];
}

public function checkAbei($attr,$params){
    if($this->$attr == 'abei'){
        return true;
    }else{
        $this->addError("username","不是abei,不能通过。");
    }
}

这个也很好理解,换汤不换药,仅仅是将匿名函数提取出来了,记住在rules函数内,自定义验证规则的名字和实现验证的方法名字必须一致。

这两个方法都很简单,也很方便,但是~,缺点也是明显的,就是只能供给User模型使用。

在我们这样一个和谐且统一的国度里,这种情况是不提倡的,于是乎,出现了第三种方法

自定义验证类

我们可以建立一个自定义的验证类,然后供各种Model使用。那么开始吧。

首先,需要在components下面新建一个验证类,我们起名为CheckAbeiValidator。什么?没有components?晕,那就新建一个文件夹就好了嘛。

CheckAbeiValidator.php

namespace app\components;
use yii\validators\Validator;

class CheckAbeiValidator extends Validator {
    public function validateAttribute($model, $attribute) {
        if($model->$attribute == 'abei'){
            return true;
        }else{
            $this->addError($model,$attribute,"不是abei,不能通过。");
        }
    }
}

你看到了么?CheckAbeiValidator继承于Validator,对Validator的validateAttribute进行重载,和上面两种方法基本一样,不同的是多了一个Model,这也对的,毕竟我是公共的,你总要告诉我是谁在让我验证,我需要告诉谁结果吧。

好,验证类好了,如何使用那?

现在我们回到User模型(User.php)

use app\components\CheckAbeiValidator;

首先我们需要使用这个类,use一下。然后....

public function rules(){
    return [
        ["username",CheckAbeiValidator::className()],
    ];
}

ok,这就是完事了,我们通过rules告诉username使用CheckAbeiValidator类来验证。

其他的模型如果想验证,也是和User一样,照着做就可以了。

这就是三种自定义验证规则的方法,希望对大家有帮助。

评论