【工兵连分享】教你三种Model(AR)中自定义验证规则的方法。 [ 技术分享 ]
各位Yii2兄弟都知道Model的rules里面可以使用自己定义的验证规则,我们今天就把自定义规则做一个总结,进行一次彻底的知识归纳。
和以往一样,先列目录。
- 匿名函数形式
- 类的公共方法形式
- 自己建立验证类形式
提前准备
在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一样,照着做就可以了。
这就是三种自定义验证规则的方法,希望对大家有帮助。
共 4 条回复
abei1982 河南洛阳
最后登录:2020-04-14
在线时长:128小时48分
- 粉丝307
- 金钱4935
- 威望50
- 积分6715