开发Web应用有一个很重要的原则,就是不要相信任何输入的数据,在使用之前必须要进行有效性检查,否则很有可能会引发各种安全性问题。Yii 2当然也不会忽略这个问题,提供了校验器这一有力的工具,该工具可同时提供客户端和服务器端的数据校验。
在Model内,重载rules()接口,配置每个字段的规则,如下(以LoginForm为例):
public function rules()
{
return [
// username and password are both required
[['username', 'password'], 'required'],
// rememberMe must be a boolean value
['rememberMe', 'boolean'],
// password is validated by validatePassword()
['password', 'validatePassword'],
];
}
每一行中,前面是字段名称,最后一个元素是规则的名称。这些规则最终是通过“校验器”来完成校验的。当然内置的校验器肯定不能够全部满足需求,因此Yii 2在根据规则名称创建校验器的时候,会首先检查该Model中是否有跟规则名称相同的函数,如果有,则校验规则的时候就直接用该函数来完成校验,譬如上面代码中的“validatePassword”规则,在LoginForm中就有接口:
public function validatePassword($attribute, $params)
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->password)) {
$this->addError($attribute, '账号或密码输入错误。');
}
}
Yii 2中,校验器存放于vendor\yiisoft\yii2\validators目录下,有如下内置校验器(这些校验器没有全部都用过,这里列出来功能,细节待用到的时候再研究):
boolean
检测输入值是否为boolean类型
captcha
检测输入的校验码是否正确,这个需要与yii\captcha\CaptchaAction一起使用
compare
与指定值进行比较,确认两者是否符合比较条件(如:>=、=、<=),譬如注册时会要求输入两次密码,要比较这两次输入的密码是否相同
date
检测输入值是否为date类型
datetime
检测输入值是否为datetime类型
time
检测输入值是否为time类型
default
这个实际上不是一个校验器,是当某个属性为空时,提供默认值用的
double
检测输入值是否为double类型
each
对输入的一组数据进行校验
检测输入值是否为email地址
exist
判断输入的值是否在数据库中存在,常用于检查某个值在外键中是否存在
file
检测输入值是否为文件
filter
将输入值转换为另一个值,它实际上不是个校验器。
image
检测输入值是否为图片
in
检测输入值是否在指定的列表中
integer
检测输入值是否为integer类型
match
使用正则表达式检查输入值
required
检测输入值是否为空
safe
标志输入的字段是否可信,Yii对Model的每个字段都要求必须要有校验器,但是有时候有些字段的确不需要,譬如主键ID。
string
检测输入值是否为string类型
trim
这实际上是一个转换器,去除掉输入的前后空格
unique
检测输入值在表中是否唯一
url
检测输入值是否为URL
ip
检测输入值是否为IP地址
参考文献:
新建一个文件:
?php
namespace common\helps;
use yii\validators\Validator;
class ArrayValidator extends Validator
{
publicfunction validateAttribute($model, $attribute)
{
if (!is_array($model->$attribute)) {
$this->addError($model, $attribute, $attribute . '必须是一个数组');
}
}
}
<a> </a>
使用的时候:
<a></a>
publicfunction rules()
return [
...
['kind_ids','common\helps\ArrayValidator'], // 自定义验证
];
本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/1875616,如需转载请自行联系原作者