热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yii验证器类细说YII验证器

在yii-1.1.10.r3566版本中,yii自带的验证器共有19个。全部如下:CValidator.phppublicstatic$builtInValidators
在 yii-1.1.10.r3566 版本中,yii自带的验证器共有 19 个。全部如下:
// CValidator.php
public static $builtInValidators=array(
'required'=>'CRequiredValidator', // 验证属性值必需有值,不能为空
'filter'=>'CFilterValidator', // 用过滤器转换属性的值
'match'=>'CRegularExpressionValidator', // 验证属性值匹配一个正则表达式
'email'=>'CEmailValidator', // 验证属性值为有一个有效的Email地址
'url'=>'CUrlValidator', // 验证属性值是一个有效的URL
'unique'=>'CUniqueValidator', // 验证属性值在表中的对应列中是唯一的
'compare'=>'CCompareValidator', // 验证属性值与另一个属性的值相等
'length'=>'CStringValidator', // 验证属性值的长度在一个范围内
'in'=>'CRangeValidator', // 验证属性值在一个预定义列表中
'numerical'=>'CNumberValidator', // 验证属性值是数字
'captcha'=>'CCaptchaValidator', // 验证属性的值等于一个显示的CAPTCHA(验证码)的值
'type'=>'CTypeValidator', // 验证属性值是一个指定的数据类型
'file'=>'CFileValidator', // 验证属性值包含上传的文件
'default'=>'CDefaultValueValidator', // 验证属性值为分配的默认值
'exist'=>'CExistValidator', // 验证属性值在表中的对应列中存在
'boolean'=>'CBooleanValidator', // 验证属性值是布尔值(true或false)
'safe'=>'CSafeValidator', // 标记属性值为安全
'unsafe'=>'CUnsafeValidator', // 标记属性值为不安全
'date'=>'CDateValidator', // 验证属性值是日期
);


使用方法就是在 CActiveRecord 或 CFormModel 的子类中重写 rules() 函数,如下:

public function rules() { return array(   array('username,email,password,password2', 'required'),   array('username', 'length', 'min'=>6, 'max'=>24),   array('email', 'email'),   array('password', 'length', 'min'=>6, 'max'=>16),   array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'), );}

rules() 中返回的数组一般如下:

array('属性名1,属性名2', '验证器别名', 'on'=>'场景', '验证器属性'=>'值', '...'=>'...')

array() 中前两个值是必须的,后面则是可选的,当然你要看具体验证器了

当有多个属性要使用同一个验证器时,可以写在同一条规则中,属性名使用英文逗号分隔

验证器别名是必须的

'on'=>'场景' 是可选的, 场景是在初始化某个具体的 CActiveRecord 类时通过构造函数设定的。
如:

class Post extends CActiveRecord

在控制器类中

$model=new Post('search'); 其中 'search' 就是场景,这样就设置了场景。当然,CActiveRecord 类的构造函数中,场景的默认值是 'insert'然后,验证器属性则要看某个具体验证器了,如class CStringValidator extends CValidator{    public $max;    public $min;    public $is;    public $tooShort;    public $tooLong;    public $allowEmpty=true;    public $encoding;}

1.

CRequiredValidator
CRequiredValidator validates that the specified attribute does not have null or empty value.

用法:array('username, email, password,sex', 'required', 'message'=>Yii::t('user','{attribute}不能为空!')),
或者 array ('username','required','requiredValue'=>100, 'message'=>Yii::t('user','{attribute}必须为100!')),
看源码是判断给定属性是否是requiredValue或者空 然后JS messages.push出提示信息 进行客户端验证

2.

 CFilterValidator
CFilterValidator transforms the data being validated based on a filter.
CFilterValidator is actually not a validator but a data processor.
必须是个有效的回调函数 is_callable / a valid callback
写不对的话常常爆
属性 "CFilterValidator.0" 未被定义. 的 CException
用法:
public function rules() { return array ( // username and password are required /* array ( 'username, password', 'required', 'message' => Yii::t ( 'user', '{attribute}不能为空' ) ), */array('username','filter','filter'=>array($this,'DataProcessor')), // rememberMe needs to be a boolean array ( 'rememberMe', 'boolean' ), // password needs to be authenticated array ( 'password', 'authenticate' ) ); } function DataProcessor() { return "abc"; }


'filter'=>array($this,'DataProcessor') $this是指这个类 这个类里面的DataProcessor函数
譬如说

if (isset ( $_POST ['LoginForm'] )) {
$model->attributes = $_POST ['LoginForm'];
$model->validate();
print_r($model->attributes);exit;
不管你输入什么 最后都过滤成了abc
Array ( [username] => abc [password] =>  [rememberMe] => 0 )


一般习惯调用PHP自带函数 过滤左右空格
array('username', 'filter', 'filter'=>'trim'),
3. CRegularExpressionValidator
3个参数 pattern allowEmpty not
用法: array (
'mobile',
'match',
'pattern' =>'/^13[0-9]|15[^4,\\D]|18[0,5-9]\\d{8}$/',

 'message' => Yii::t ( 'activity', '无效的{attribute}' ),
),

上面就是自己写个正则匹配手机号码格式

4.CEmailValidator
用法:array('email', 'email'),
多email验证自己写个小验证器:

public function rules() { return array( array('email, title, body', 'required', 'message'=>Yii::t('user','{attribute}不能为空')), array('email','mailValidator'), ); } /** * 客观需求,CEmailValidator已经不能满足要求 * 先分割后判断 */ public function mailValidator(){ $singleEmail = strtok($this->email,' '); while ($singleEmail !== false) { $validator = new CEmailValidator; if(!$validator->validateValue($singleEmail)){ $this->addError('email', Yii::t('user', '邮箱').'格式不正确!'); //throw new Exception('Email is invalid', '30201'); } //echo "$singleEmail
"; $singleEmail = strtok(" "); } }


  

  
5.CUrlValidator
用法:array('urlname','url','validSchemes'=>array('http','https')),
这样就只有http和https开头的符合正则pattern的url才是可以通过验证的url


  
6.CUniqueValidator
CUniqueValidator validates that the attribute value is unique in the corresponding database table.
用法:array('username','unique','className'=>'User'),//User为Model,username在user中不允许重复

 7.CCompareValidator
用法:
array('exchange','compare','operator'=>'>',
'compareValue'=>1,
'message'=>Yii::t('trader', '{attribute} 必须为正数!')),//>0
array('exchange','compare','operator'=>'<=',
'compareValue'=>100,
'message'=>Yii::t('trader', '{attribute} 不能超过100!')),//<=100

属性跟特殊值比较

或者:array (
'conpassword',
'compare',
'compareAttribute' => 'password'
),

属性跟属性比较

 8.CStringValidator
用法:array('username','length','max'=>12,'min'=>2,
'tooLong'=>Yii::t('user', '{attribute}至多12个字符'),
'tooShort'=>Yii::t('user', '{attribute}至少2个字符'),
'encoding'=>'utf-8'),
array('password','length','max'=>16,'min'=>6,
'tooLong'=>Yii::t('user', '{attribute}至多16个字符'),
'tooShort'=>Yii::t('user', '{attribute}至少6个字符')),


 9.CRangeValidator
用法:array('reward','in',array(1,10,100,1000)),
 reward在特定数组值内,譬如上面 reward只能有4个选择


 10.CNumberValidator

CNumberValidator validates that the attribute value is a number.
用法:array('username','numerical','integerOnly'=>true,'min'=>0,'max'=>1000,
'tooBig'=>Yii::t('user', '{attribute}不能大于1000'),
'tooSmall'=>Yii::t('user', '{attribute}必须大于0'),
),

 11.CCaptchaValidator
用法:array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(),'on'=>'three'),


 12.CTypeValidator
Valid values include 'string', 'integer', 'float', 'array', 'date', 'time' and 'datetime'.
用法:array('username','type','type'=>'date','dateFormat'=>'MM/dd/yyyy'),


 13.CFileValidator
用法:array('filename', 'file', 'allowEmpty'=>true, 'types'=>'zip, rar, xls, pdf, ppt'),
 14.CDefaultValueValidator
用法:array('created','default','value'=>new CDbExpression('NOW()'),'setOnEmpty'=>false),

 15.CExistValidator

用法:array('username','exist','className'=>'User'),

 18.CUnsafeValidator 19.CDateValidator用法:array('username','date','format'=>'yyyy-MM-dd'),

在Yii中虽然有19个内置的验证器,但是有时候并不能满足我们的要求,这时就需要自定义一个符合自己要求的验证器了。

1、在验证器validator类中有一个createValidator方法,没有具体研究。

2、另一种方法是自己重新定义一个验证器类,重新写一个类。具体方法如下:

  1. 将 framework中提供的默认校验类(这里以CUniqueValidator为例)复制到自己的web应用目录 extensions\validator下(该目录不存在,自己建一个就行),更换一个文件名,假设为 ZUnique.php。打开文件,相应类名也更改,校验方法根据自己需要修改。

  2. 配置config/main.php,import项增加一个条目
    'application.extensions.validator.*',

  3. 在模型类的rules方法中引用,如:
    array('username,', 'ZUniqueValidator');

提醒:可以到官方extensions下载一些现成validator试用。


自己也可以自己写验证表达式(正则式)

array('user_qq','match','pattern'=>'/[1,9]\d{8,10}/','message'=>'qq号码输入不正确');///验证qq号码是否是符合


array('user_addr','in','range=>array(1,2,3,4)','message'=>'你选择的地址信息不正确');////验证选择的信息 是否是1 2 3 4 中的任意一个


你也可以自定义函数 进行验证

array('user_name','user_check',''),

然后在该model文件中 自定义函数user_check 对user_check进行验证

public function user_check(){

$len = strlen($this->user_name);

if ($len<2 ){

$this->addError('user_name','你的名字太短了');////为user_name 增加错误信息,不可以替换

}


}

本文出自 “mysql_php_apache” 博客,请务必保留此出处http://johnzxw.blog.51cto.com/4510670/1316908


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
  • php设置数组大小_【大厂必备】2020超经典PHP面试题
    结合我自己这段时间的面试情况,面对的一些php面试题列举出来,基本上结合自己的看法回答的,不妥的地方请大家指出去,与大家一起 ... [详细]
  • 【Mysql】九、Mysql高级篇 索引
    MYSQL索引一、什么是索引?二、索引数据结构1、mysql数据库的四种索引2、BTREE结构三、索引分类、创建索引、查看索引1、单值索引2、复合索引3、函数索引4、 ... [详细]
  • 导读执行UPDATE时,WEHRE条件列虽已有索引,但还会锁全表,肿么回事?问题描述叶师傅有次上课过程中执行UPDATE测试案例时,发现虽然WHERE条件列已有索 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 我尝试使用Vue.js在Laravel中实现imageupload吗?但是,我不知道为什么图像 ... [详细]
author-avatar
湘刘涛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有