1.1  字段校验

1.1.1  简介

开发Web应用有一个很重要的原则,就是不要相信任何输入的数据,在使用之前必须要进行有效性检查,否则很有可能会引发各种安全性问题。Yii 2当然也不会忽略这个问题,提供了校验器这一有力的工具,该工具可同时提供客户端和服务器端的数据校验。

1.1.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, '账号或密码输入错误。');
        
}
     }
 }

 

1.1.3  内置校验器

Yii 2中,校验器存放于vendor\yiisoft\yii2\validators目录下,有如下内置校验器(这些校验器没有全部都用过,这里列出来功能,细节待用到的时候再研究):

boolean

检测输入值是否为boolean类型

captcha

检测输入的校验码是否正确,这个需要与yii\captcha\CaptchaAction一起使用

compare

与指定值进行比较,确认两者是否符合比较条件(如:>==<=),譬如注册时会要求输入两次密码,要比较这两次输入的密码是否相同

date

检测输入值是否为date类型

datetime

检测输入值是否为datetime类型

time

检测输入值是否为time类型

default

这个实际上不是一个校验器,是当某个属性为空时,提供默认值用的

double

检测输入值是否为double类型

each

对输入的一组数据进行校验

email

检测输入值是否为email地址

exist

判断输入的值是否在数据库中存在,常用于检查某个值在外键中是否存在

file

检测输入值是否为文件

filter

将输入值转换为另一个值,它实际上不是个校验器。

image

检测输入值是否为图片

in

检测输入值是否在指定的列表中

integer

检测输入值是否为integer类型

match

使用正则表达式检查输入值

required

检测输入值是否为空

safe

标志输入的字段是否可信,YiiModel的每个字段都要求必须要有校验器,但是有时候有些字段的确不需要,譬如主键ID

string

检测输入值是否为string类型

trim

这实际上是一个转换器,去除掉输入的前后空格

unique

检测输入值在表中是否唯一

url

检测输入值是否为URL

ip

检测输入值是否为IP地址

 

1.1.4  自定义校验器

参考文献:

1、http://www.cnblogs.com/yhdsir/p/5181938.html

 

新建一个文件:

?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 . '必须是一个数组');

        }

    }

}

                            spacer.gif

 

使用的时候:

spacer.gif

publicfunction rules()

{

    return [

        ...

        ['kind_ids','common\helps\ArrayValidator'], // 自定义验证

        ...

    ];

}