最全面的Yii2的Model规则rules校验Validate使用方法
【摘要】
目录
前言`rules()`基本类型支持boolean(布尔型)compare(比对)date(日期)default(默认值)double(双精度浮点型)each(循环验证)email(电子邮件)...
前言
作为经典三层架构MVC中的数据模型Model层,通常和数据库紧密连接,在数据读写之前,做数据的校验。
Yii2作为目前比较流行的PHP框架,在Model层也做了非常完善的封装。
下面是最全面的Model层数据验证的写法,各位可以根据自己的实际情况在自己的model中使用各自的方法。
rules()
基本类型支持
rules()
对应的是当前模型的字段,如果是对应数据库的表,就是对应表中的字段,gii生成的rules()
是默认和表限制一样的,如果是自定义的表单,就需要自己对字段进行限制了。
public function rules()
{
return [
[['ad_id', 'updated_at'], 'required'],
[['ad_id', 'size_code', 'updated_at'], 'integer'],
[['title'], 'string', 'max' => 128],
];
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
boolean(布尔型)
['selected', 'boolean'],
- 1
compare(比对)
['password', 'compare', 'compareAttribute' => 'password_repeat'],
- 1
date(日期)
[['from_datediandianxiyu_geek', 'to_datediandianxiyu_geek'], 'date'],
[['from_datetimediandianxiyu_geek', 'to_datetimediandianxiyu_geek'], 'datetime'],
[['some_timediandianxiyu_geek'], 'time'],
- 1
- 2
- 3
default(默认值)
['blog', 'default', 'value' => 'diandianxiyu_geek'],
- 1
double(双精度浮点型)
['salary', 'double'],
- 1
each(循环验证)
验证数组
['categoryIDs', 'each', 'rule' => ['integer']],
- 1
email(电子邮件)
['email', 'email'],
- 1
exist(存在)
['diandianxiyu_geek', 'exist'],
- 1
file(文件)
['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024*1024]
- 1
filter(过滤器)
['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true],
- 1
image(图片)
['primaryImage', 'image', 'extensions' => 'png, jpg',
'minWidth' => 100, 'maxWidth' => 1000,
'minHeight' => 100, 'maxHeight' => 1000,
],
- 1
- 2
- 3
- 4
ip(IP地址)
['ip_address', 'ip'],
- 1
in(范围)
['level', 'in', 'range' => [1, 2, 3]],
- 1
integer(整数)
['age', 'integer'],
- 1
match(正则表达式)
['username', 'match', 'pattern' => '/^[a-z]\w*$/i']
]
- 1
- 2
number(数字)
['salary', 'number'],
- 1
required(必填)
[['username', 'password'], 'required'],
- 1
safe(安全)
安全字符是不进行验证的要注意。
['description', 'safe'],
- 1
string(字符串)
['username', 'string', 'length' => [4, 24]],
- 1
trim(去空格)
[['username', 'email'], 'trim'],
- 1
unique(唯一性)
['a1', 'unique'],
- 1
url(网址)
['website', 'url', 'defaultScheme' => 'http'],
- 1
写在beforeValidate自动校验前
上面的验证方法,可以满足一些基本的业务需求,但是一般业务的需要更为复杂,需要我们单独写方法去做验证。
比如如果是新数据就写入创建时间,不是新数据就不需要。
比如需要验证数据是否合法,都可以写在beforeValidate()
.
数据填充
public function beforeValidate()
{
$this->status = self::STATUS_ONLINE;
if($this->isNewRecord){
$this->created_at = time();
}
$this->updated_at = time();
return parent::beforeValidate();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
复杂业务判断
public function beforeValidate()
{
if('判断业务条件'){
$this->addError('title', 'XXX【'.$this->title.'】已经存在');
}
return parent::beforeValidate();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
addError 添加错误信息
当我们在模型中通过业务判断主动返回某个字段的错误信息,那么这个错误信息就会通过表单模板中的{error}
展示给用户。
并且,如果存在错误的话,模型save方法默认调用的验证方法Validate也不会通过,这样也就不会完成表单提交。
总结
Yii2 的数据model层的操作,是以数据表作为基础的。
- gii能默认根据数据库字段自动写入默认验证规则
- 我们在实际业务中,再调整验证规则
- beforeValidate的重写可以完成数据写入和数据校验,并能自定义返回的信息
- addError方法在模型中很有用,可以不允许表单验证通过保存
文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。
原文链接:coderfix.blog.csdn.net/article/details/119354668
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)