Yii核心验证器api详解


Posted in PHP onNovember 23, 2016

本文实例讲述了Yii核心验证器api。分享给大家供大家参考,具体如下:

核心验证器 Core Validators

前言

Yii 提供了一系列常用的核心 validators, 你可在
yii\validators namespace 中找到. 不用使用长的验证器类名, 你可以使用别名代替他们.

例如, 你可以使用别名 required 代替 yii\validators\RequiredValidator 类:

<?php
public function rules()
{
  return [
    [['email', 'password'], 'required'],
  ];
}
?>

这个 yii\validators\Validator::$builtInValidators 属性生命所有支持的验证器的别名.

接下来, 我们将讲解每种核心验证器的用法.

1. boolean 对错值

<?php
[
  // 检查是否 "selected" 是 0 或 1, 不管数据类型
  ['selected', 'boolean'],
  // 检查是否 "deleted" 是一个 boolean 类型, 只能是 true 或则 false
  ['deleted', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true],
]
?>

上面检测是否是一个bool值.

trueValue: 代表true时的值. 默认为 '1'.
falseValue: 代表 false 时的值. 默认为 '0'.
strict: 是否输入框中的值必须匹配 设置的 trueValue 和 falseValue. 默认为 false.

注意: 因为数据提交通过HTML形式都是字符创, 一般你需要设置 strict 属性为 false.

2. captcha 验证码

<?php
[
  ['verificationCode', 'captcha'],
]
?>

这个验证器通常和
yii\captcha\CaptchaAction 以及
yii\captcha\Captcha 一起使用以确保输入的是相同的验证码 通过 CAPTCHA 组件.
caseSensitive: 是否验证码需要区分大小写. 默认为 false.
captchaAction: 默认的验证码的 CAPTCHA action 生成 CAPTCHA image的路径. 默认为 'site/captcha'.
skipOnEmpty: 输入为空的时候是否跳过验证. 默认false, 即 input 输入是必须的.

3. compare 比较

<?php
[
  // 验证是否 "password" 属性和 "password_repeat"是否相等
  ['password', 'compare'],
  // 验证 age >= 30
  ['age', 'compare', 'compareValue' => 30, 'operator' => '>='],
]
?>

这个验证器比较指定的输入值和另一个值确保他们之间使用指定的操作符.

compareAttribute: 属性的名字即将会和谁比较.当验证器被用来验证一个属性的时候, 他会和属性名字相同 但带有后缀 _repeat的属性相比较. 例如, 如果要验证的属性名是 password, 那么默认对比的属性名就是 password_repeat 你可以指定你想要的值.
compareValue: 一个和输入值比较的常量值. 当 property 和 compareAttribute 属性被同时指定的时候, 这个值将优先.
operator: 比较的操作符. 默认是 ==, 即输入值和 compareAttribute 或 compareValue 值相等的时候才会成功.
支持下面这些操作符: ==、===、!=、!==、>、>=、<、<=。

4. date 日期

<?php
[
  [['from_date', 'to_date'], 'date'],
]
?>

这个验证器检查输入的值是一个日期date, 时间time 或者datetime 以一个合适的形式. 可选的,他能转换输入值成为一个UNIX时间戳存储在一个通过timestampAttribute 指定的属性里.

format: 这个 date/time 是 http://php.net/manual/en/datetime.createfromformat.php 中声明的所有支持的格式

如果这个值没有设置, 他会自动取值 Yii::$app->formatter->dateFormat.
timestampAttribute: 属性名用来存储转换将输入的日期或时间. 也可以是相同的属性名作为被验证过的. 如果是这种情况, 原始的值将会被时间戳重写. 你可以看看 "如何处理日期选择器 DatePicker" 用例子.
http://www.yiiframework.com/doc-2.0/widget-jui#datepicker-date-input

如果输入的是可选的,你也可能要添加一个默认值滤波器除了日期验证,以确保空输入存储为NULL。否则你可能最终得到的日期像日期选择器的输入字段在0000-00-00 或 您的数据库1970-01-01.

<?php
[
  [['from_date', 'to_date'], 'default', 'value' => null],
  [['from_date', 'to_date'], 'date'],
],
?>

5.default 默认值

<?php
[
  // 设置 "age" 为 null 如果他是空的
  ['age', 'default', 'value' => null],
  // 设置 "country" 为 "USA" 如果他是空的
  ['country', 'default', 'value' => 'USA'],
  // 分配 "from" 和 "to" 分别加3天和6天, 如果他们是空的话
  [['from', 'to'], 'default', 'value' => function ($model, $attribute) {
    return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days'));
  }],
]
?>

这个验证器不验证数据. 当他们为空的时候.分配给属性值。

value: 表单的默认值 函数原型如下,

<?php
function foo($model, $attribute) {
  // ... 组装 $value ...
  return $value;
}
?>

6. double 浮点值

<?php
[
  // 检查 "salary" 是一个 double 数字
  ['salary', 'double'],
]
?>

相当于一个数字验证器:

max: 数字上限,没设置不检查
min: 数字下线,没设置不检查

7. email 邮箱验证

<?php
[
  // 检查邮箱是一个有效的 "email"地址
  ['email', 'email'],
]
?>

allowName: 检查名字是否允许在邮箱中出现 (e.g. John Smith <john.smith@example.com>). 默认为 false.
checkDNS,是否检查电子邮件的域名是否存在,是否有任何一个A或MX记录。请注意,这可能检查由于临时DNS问题失败,即使电子邮件地址实际上是有效的。默认为false。
enableIDN,验证过程是否应考虑到IDN(国际化域名)。默认为false。需要注意的是,为了使用IDN验证您必须安装并启用国际PHP扩展,或异常将被抛出。

8. exist 是否存在

<?php
[
  // a1 需要在 属性列中存在 "a1" 这个好像默认就有啊
  ['a1', 'exist'],
  // a1 存在,但它的值将使用A2来检查是否存在
  ['a1', 'exist', 'targetAttribute' => 'a2'],
  // a1 和 a2 需要同时存在, 他们都将接收错误信息
  [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']],
  // a1 和 a2 需要同时存在, 只有 a1 将接收错误信息
  ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']],
  // a1 需要存在 通过检测a2 和 a3 (用 a1 的值)
  ['a1', 'exist', 'targetAttribute' => ['a2', 'a1' => 'a3']],
  // a1 需要存在. 如果 a1是一个数组, 那么每个元素都必须存在.
  ['a1', 'exist', 'allowArray' => true],
]
?>

这个验证器检查输入的值能否被找到在在对应的表的列值里,他只会在 Active Record model 模型的属性里起作用.

他支持验证单列或多列

targetClass: 用来寻找输入值验证的 Active Record 类名. 如果未设置, 默认使用当前设置的模型类.
targetAttribute: 应该用于验证输入值的存在在targetClass的属性的名称。如果没有设置,将使用目前正在验证的属性的名称。可以使用阵列来验证多列的存在的同时。数组的值是将被用于验证存在的属性,而数组键是其值要验证的属性。如果键和值都是一样的,你可以指定值.
filter: additional filter to be applied to the DB query used to check the existence of the input value. This can be a string or an array representing the additional query condition (refer to yii\db\Query::where() on the format of query condition), or an anonymous function with the signature function ($query), where $query is the Query object that you can modify in the function.
allowArray: 是否允许输入的值是一个array.默认 false. 若果属性是 true 而且输入是一个 array, 那么熟这里的每一个元素都必须存在在指向的目标列里. 注意这个属性不能被设置成true 如果你设置验证多列通过设置 targetAttribute 为一个 array.

9. file 文件验证

<?php
[
  // 检查 "primaryImage" 上传的文件格式是 PNG, JPG 或者 GIF
  // the file size must be less than 1MB
  ['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024],
]
?>

检查是否是一个有效的上传文件。

extensions: 允许上传的文件类型列表.他可以是一个数组 或者是一个以逗号分割的字符串(如. "gif, jpg"). 扩展名不区分大小写,默认为 null, 意味着所有的文件扩展名是允许的.
mimeTypes: 允许上传的文件资源的媒体类型。他可以是一个数组 或者是一个以逗号或空格分割的字符串 (如. "image/jpeg, image/png"). 不区分大小写,默认为 null, 意味着所有的文件扩展名是允许的.
minSize: 上传文件的最小字节数 未设不做判断.
maxSize: 上传文件的最大字节数 未设不做判断.
maxFiles: 最大的上传文件数 默认为 1, 意味着只能上传单个文件对于单个文件上传框. 如果大于 1, 那么 input必须是一个 array 包含至多 maxFiles 数量的上传文件.
checkExtensionByMimeType: 是否检查文件的扩展名. 如果由MIME类型检查所产生的扩展不同于上传的文件扩展名,该文件将被认为是无效的。默认值为true,意思进行这样的检查。
FileValidator 和 yii\web\UploadedFile 一起使用. .

文件上传请参考:http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html

10. filter 过滤

<?php
[
  // 去掉 "username" 和 "email" 输入空格 跳过数组验证
  [['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true],
  // 验证正常 "phone" 输入
  ['phone', 'filter', 'filter' => function ($value) {
    // 验证正确性手机代码
    return $value;
  }],
]
?>

这个验证器验证不了数据. 相反的, it applies a filter on the input value and assigns it back to the attribute being validated.

filter: 一个php回调函数定义一个filter. 他可能是一个全局函数的名字, 一个匿名函数等等. 函数的原型一定是<?php function ($value) { return $newValue; }  ?>这个属性必须设置.

skipOnArray: 当输入只是一个数组的时候是否跳过.默认是 false. 请注意,如果过滤器无法处理数组输入,您应该将此属性设置为true。否则,可能会发生一些PHP错误.

小提示: 去空格直接用trim验证.

小提示: 部分封装可以直接使用系统函数如intval:

<?php
['property', 'filter', 'filter' => 'boolval'],
['property', 'filter', 'filter' => 'intval'],
?>

11. image 图片

<?php
[
  // 检查 "primaryImage" 是否是一个有效的图片 且大小合适
  ['primaryImage', 'image', 'extensions' => 'png, jpg',
    'minWidth' => 100, 'maxWidth' => 1000,
    'minHeight' => 100, 'maxHeight' => 1000,
  ],
]
?>

文件验证器的扩展:

minWidth: 最小的宽度 不设无限制.
maxWidth: 最大的宽度 不设无限制.
minHeight: 最小的高度 不设无限制.
maxHeight: 最大的高度 不设无限制.

12. in 在那一个数组里面的值

<?php
[
  // 检查 "level" 是 1, 2 或 3
  ['level', 'in', 'range' => [1, 2, 3]],
]
?>

检查输入的值是否存在于给定的系列值的列表中.

range: 给定范围值的列表.
strict: 输入值和给定值之间的比较结果是否应严格(的类型和值必须相同)。默认为false。
not: 验证结果是否应该被反转。默认为false。当此属性设置为true,验证检查,输入的值不能是给定列表的值中.
allowArray: 是否允许输入值是一个数组。如果这是真的,并输入值是一个数组,数组中的每个元素必须值的给定列表中找到,或验证会失败。

13. integer 整型验证

<?php
[
  // 检查 "age" 是一个整型值
  ['age', 'integer'],
]
?>

max: 上限 不设不检查.
min: 下限 不设不检查..

14. match 正则匹配检查

<?php
[
  // 检查 "username" 以字母开头,并且只包含文字字符
  ['username', 'match', 'pattern' => '/^[a-z]\w*$/i']
]
?>

输入值指定的正则表达式匹配验证检查.

pattern: 输入值必须匹配的规则. 属性必须设置,否则将会抛出异常.
not: 是否反转验证结果. 默认 false.

15. number 数字检查

<?php
[
  // 检查 "salary" 是一个数字
  ['salary', 'number'],
]
?>

相当于double验证器.

max: 上限 不设不检查.
min: 下限 不设不检查.

16. required  是否为空检查

<?php
[
  // 检查 "username" 和 "password" 不是空的
  [['username', 'password'], 'required'],
]
?>

该验证器阻止用户提交空的表单数据.

requiredValue: 应该输入的值. 如果未设 意味着输入值 不应该为空.
strict: 验证一个值时是否应该检查数据类型. 默认false.当 requiredValue未设置时,如果这个属性是 true, 验证器会检查输入值不严格null;如果改属性false,验证器将使用一个松散的规则来确定一个值是空的或不. 当 requiredValue设置了,输入和requiredValue之间的比较也将检查数据类型,如果此属性为true。

17. safe  标记输入是安全属性

<?php
[
  // 标记 "description" 是一个 safe 的属性
  ['description', 'safe'],
]
?>

这个验证器不会执行数据验证.相反, 它是用来标记的属性是一个安全属性(我猜作用是不会进行字符转义吧)。

18. string 字符串验证

<?php
[
  // 检查 "username"是一个 string 而且长度在 4 和 24 之间
  ['username', 'string', 'length' => [4, 24]],
]
?>

这个验证器检查输入的值是一个字符串且长度在确定的值的范围里。

length: 指定待验证的字符串的长度. 可以指定以下形式:
   一个整数: 字符串的精确长度;
   单个数组元素: 输入的最小长度 (e.g. [8]). 必须超过或等于这个数
   两个数组元素: 输入的最小长度和最大长度 (e.g. [8, 128]).
min: 输入字符串的最小长度 未设不限制.
max: 输入字符串的最大长度 未设不限制..
encoding: 输入字符串的编码 未设默认 UTF-8.

19. trim 去空格

<?php
[
  // 去掉 "username" 和 "email" 两边的空格
  [['username', 'email'], 'trim'],
]
?>

不进行数据验证 只进行去空格 如果属性是一个数组 将会自动忽略此过滤.

20. unique 唯一性验证

<?php
[
  // a1 需要是在由“a1”属性表示的列中的唯一
  ['a1', 'unique'],
  // a1 必须是唯一的,但列a2将用于检查的a1值的唯一性
  ['a1', 'unique', 'targetAttribute' => 'a2'],
  // a1和a2的需要是唯一的,并且它们都将收到错误消息
  [['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']],
  // a1和a2的需要是唯一的,只有a1将收到错误消息
  ['a1', 'unique', 'targetAttribute' => ['a1', 'a2']],
  // a1需要通过检查的两个a2和a3的唯一性(使用a1的值)是唯一的
  ['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']],
]
?>

这验证检查,如果输入的值是表列中的唯一。它仅适用于活动记录模型的属性。它支持验证对任何单个列或多个列。

targetClass: 应该是被用于验证查找输入值的活动记录类的名字。如果没有设置,将要使用的类目前正在验证该模型的.
targetAttribute: 应该用来验证输入值的唯一性在targetClass的属性的名称。如果没有设置,将使用目前正在验证的属性的名称。可以使用阵列来验证多列的唯一性的同时。数组的值是将被用于验证唯一性的属性,而数组键是其值要验证的属性。如果键和值都是一样的,你可以指定的值。
filter: a额外的过滤器被应用到用于检查输入值的唯一性的数据库查询。这可以是一个字符串或代表附加查询条件的数组(参考 yii\db\Query::where() 查询条件的格式), 或者是一个匿名函数像: function ($query), 其中$query是你可以在函数修改查询对象。
http://www.yiiframework.com/doc-2.0/yii-db-query.html#where()-detail

21. url 地址验证

<?php
[
  // 检查 "website" 是一个有效的 URL. 前置 "http://" 到 "website" 属性
  // 如果它不具有一个URI模式
  ['website', 'url', 'defaultScheme' => 'http'],
]
?>

validSchemes: 一个数组指定URI方案应被认为有效。默认为['HTTP','HTTPS'],意思是HTTP和HTTPS URL被认为是有效的。
defaultScheme: 默认URI方案要预先考虑到输入,如果它不具有方案的一部分。默认为null,意味着不修改输入值。
enableIDN:验证是否应考虑到IDN(国际化域名)。默认为false。需要注意的是,为了使用IDN验证您必须安装并启用国际PHP扩展,否则异常将会被抛出。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
PHP实现文件安全下载
Oct 09 PHP
PHP音乐采集(部分代码)
Feb 14 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
Feb 16 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
深入分析php中接口与抽象类的区别
Jun 08 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
PHP开发微信支付的代码分享
May 25 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
Nov 23 #PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 #PHP
php 数组处理函数extract详解及实例代码
Nov 23 #PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 #PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 #PHP
CI框架中类的自动加载问题分析
Nov 21 #PHP
CI框架常用函数封装实例
Nov 21 #PHP
You might like
PHP取进制余数函数代码
2012/01/19 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
php实现socket推送技术的示例
2017/12/20 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
javascript中if和switch,==和===详解
2015/07/30 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
jQuery位置选择器用法实例分析
2019/06/28 jQuery
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
简单谈谈Python中函数的可变参数
2016/09/02 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
化工工艺专业求职信
2013/09/22 职场文书
九年级物理教学反思
2014/01/29 职场文书
小学老师寄语大全
2014/04/04 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
小学教师年度个人总结
2015/02/05 职场文书
先进工作者个人总结
2015/02/15 职场文书
小学大队长竞选稿
2015/11/20 职场文书
Golang 结构体数据集合
2022/04/22 Golang