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 相关文章推荐
黑夜路人出的几道php笔试题
Aug 04 PHP
php 图片加水印与上传图片加水印php类
May 12 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 PHP
php 实现进制相互转换
Apr 07 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
php中简单的对称加密算法实现
Jan 05 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
Jul 03 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模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
vue二级路由设置方法
2018/02/09 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
python 循环遍历字典元素的简单方法
2016/09/11 Python
Python模拟登陆实现代码
2017/06/14 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
如何用python整理附件
2018/05/13 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
美德少年事迹材料
2014/01/23 职场文书
万年牢教学反思
2014/02/15 职场文书
入党转正介绍人意见
2015/06/03 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server