Yii 2 —— 字段校验

简介:

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'], // 自定义验证

        ...

    ];

}





本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/1875616,如需转载请自行联系原作者

目录
相关文章
|
Java
validator分组校验
validator分组校验
125 0
|
7月前
|
Java 数据库 数据安全/隐私保护
【SpringBoot】Validator组件+自定义约束注解实现手机号码校验和密码格式限制
【SpringBoot】Validator组件+自定义约束注解实现手机号码校验和密码格式限制
688 1
|
5月前
|
JavaScript
iview 表单有值却校验失败
iview 表单有值却校验失败
350 1
|
3月前
|
Java 数据库连接 测试技术
自定义校验注解,优雅的实现手机号,身份证号的格式校验!
本文介绍了如何创建自定义校验注解来实现手机号和身份证号的格式校验,包括定义注解、实现校验逻辑、将注解应用于模型类,以及常用的校验器库和框架,旨在提高代码的可维护性和减少重复的校验逻辑。
|
6月前
|
Java Spring 容器
详解java参数校验之:顺序校验、自定义校验、分组校验(@Validated @GroupSequence)
详解java参数校验之:顺序校验、自定义校验、分组校验(@Validated @GroupSequence)
|
7月前
使用Hibernate-Validate进行参数校验
使用Hibernate-Validate进行参数校验
83 3
|
前端开发 Java 数据库
Spring Entity数据校验,分组校验,返回校验结果给前端
Spring Entity数据校验,分组校验,返回校验结果给前端
104 0
|
7月前
表单常用验证数据类型,验证一切(checkEverything)
表单常用验证数据类型,验证一切(checkEverything)
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
|
前端开发 Java 数据库
SpringBoot分组校验及自定义校验注解
在日常的开发中,参数校验是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性。在此之前写过一篇SpringBoot统一参数校验主要介绍了一些简单的校验方法。而这篇则是介绍一些进阶的校验方式。比如说:在某个接口编写的过程中肯定会遇到,当xxType值为A,paramA值必传。xxType值为B,paramB值必须传。对于这样的,通常的做法就是在controller加上各种if判断。显然这样的代码是不够优雅的,而分组校验及自定义参数校验,就是来解决这个问题的。