thinkphp有一个自动验证的方法
验证规则如下

array(array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),......
);

注:研究源码后发现其实还有第7个参数,是给函数或者回调方法传参数用的,参数1默认为该字段值,如:

array('mobile','is_phone','手机格式不正确',1,'function','参数2,参数3')

验证支付动态和静态
静态验证
在模型类里面预先定义好该模型的自动验证规则,在使用create方法后会自动去验证。
以下是官方的例子
1.首先在模型中定义好验证的规则

namespace Home\Model;
use Think\Model;
class UserModel extends Model{protected $_validate = array(array('verify','require','验证码必须!'),  // 都有时间都验证array('name','checkName','帐号错误!',1,'function',4),  // 只在登录时候验证array('password','checkPwd','密码错误!',1,'function',4), // 只在登录时候验证);
}

2.在调用的时候用create方法会自动进行验证

$User = D("User"); // 实例化User对象
if (!$User->create($_POST,4)){ // 登录验证数据// 验证没有通过 输出错误提示信息exit($User->getError());
}else{// 验证通过 执行登录操作
}

动态验证
以下是官方的例子

$rules = array(array('verify','require','验证码必须!'), //默认情况下用正则进行验证array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
);
$User = M("User"); // 实例化User对象
if (!$User->validate($rules)->create()){// 如果创建失败 表示验证没有通过 输出错误提示信息exit($User->getError());
}else{// 验证通过 可以进行其他数据操作
}

下面是核心的代码分析:
create方法调用后会调用autoValidation方法,方法如下

protected function autoValidation($data,$type) {if(!empty($this->options['validate'])) {$_validate   =   $this->options['validate'];unset($this->options['validate']);}elseif(!empty($this->_validate)){$_validate   =   $this->_validate;}// 属性验证if(isset($_validate)) { // 如果设置了数据自动验证则进行数据验证if($this->patchValidate) { // 重置验证错误信息$this->error = array();}foreach($_validate as $key=>$val) {// 验证因子定义格式// array(field,rule,message,condition,type,when,params)// 判断是否需要执行验证//cqh:$val[5]为验证时间,这里判断是设置了验证时间,默认为插入和更新都验证if(empty($val[5]) || $val[5]== self::MODEL_BOTH || $val[5]== $type ) {if(0==strpos($val[2],'{%') && strpos($val[2],'}'))// 支持提示信息的多语言 使用 {%语言定义} 方式$val[2]  =  L(substr($val[2],2,-1));$val[3]  =  isset($val[3])?$val[3]:self::EXISTS_VALIDATE;//$val[3]为验证条件$val[4]  =  isset($val[4])?$val[4]:'regex';//$val[4]为验证规则,默认为正则regex// 判断验证条件(self::EXISTS_VALIDATE|0:存在字段就验证,self::MUST_VALIDATE|1:必须验证,self::VALUE_VALIDATE|2:值不为空的时候验证  switch($val[3]) {case self::MUST_VALIDATE:   // 值为1:必须验证 不管表单是否有设置该字段if(false === $this->_validationField($data,$val)) return false;break;case self::VALUE_VALIDATE:    // 值为2:值不为空的时候才验证if('' != trim($data[$val[0]]))if(false === $this->_validationField($data,$val)) return false;break;default:    // ,默认表单存在该字段就验证if(isset($data[$val[0]]))if(false === $this->_validationField($data,$val)) return false;}}}// 批量验证的时候最后返回错误if(!empty($this->error)) return false;}return true;
}

以下是$this->_validationField方法,验证表单字段,并收集错误信息到$this->error属性上

/*** 验证表单字段 支持批量验证* 如果批量验证返回错误的数组信息* @access protected* @param array $data 创建数据* @param array $val 验证因子* @return boolean*/
protected function _validationField($data,$val) {if($this->patchValidate && isset($this->error[$val[0]]))return ; //当前字段已经有规则验证没有通过if(false === $this->_validationFieldItem($data,$val)){if($this->patchValidate) {$this->error[$val[0]]   =   $val[2];}else{$this->error            =   $val[2];return false;}}return ;
}

以下是$this-> _validationFieldItem方法,返回验证结果

/*** 根据验证因子验证字段* @access protected* @param array $data 创建数据* @param array $val 验证因子,注意:$val[6]为验证参数* @return boolean*/
protected function _validationFieldItem($data,$val) {switch(strtolower(trim($val[4]))) {case 'function':// 使用函数进行验证case 'callback':// 调用方法进行验证$args = isset($val[6])?(array)$val[6]:array();if(is_string($val[0]) && strpos($val[0], ','))$val[0] = explode(',', $val[0]);if(is_array($val[0])){// 支持多个字段验证foreach($val[0] as $field)$_data[$field] = $data[$field];array_unshift($args, $_data);}else{array_unshift($args, $data[$val[0]]);}if('function'==$val[4]) {return call_user_func_array($val[1], $args);}else{return call_user_func_array(array(&$this, $val[1]), $args);}case 'confirm': // 验证两个字段是否相同return $data[$val[0]] == $data[$val[1]];case 'unique': // 验证某个值是否唯一if(is_string($val[0]) && strpos($val[0],','))$val[0]  =  explode(',',$val[0]);$map = array();if(is_array($val[0])) {// 支持多个字段验证foreach ($val[0] as $field)$map[$field]   =  $data[$field];}else{$map[$val[0]] = $data[$val[0]];}if(!empty($data[$this->getPk()])) { // 完善编辑的时候验证唯一$map[$this->getPk()] = array('neq',$data[$this->getPk()]);}if($this->where($map)->find())   return false;return true;default:  // 检查附加规则return $this->check($data[$val[0]],$val[1],$val[4]);}
}

以下是附加规则的方法$this->check,验证thinkphp定义好的规则

/*** 验证数据 支持 in between equal length regex expire ip_allow ip_deny* @access public* @param string $value 验证数据* @param mixed $rule 验证表达式* @param string $type 验证方式 默认为正则验证* @return boolean*/
public function check($value,$rule,$type='regex'){$type   =   strtolower(trim($type));switch($type) {case 'in': // 验证是否在某个指定范围之内 逗号分隔字符串或者数组case 'notin':$range   = is_array($rule)? $rule : explode(',',$rule);return $type == 'in' ? in_array($value ,$range) : !in_array($value ,$range);case 'between': // 验证是否在某个范围case 'notbetween': // 验证是否不在某个范围            if (is_array($rule)){$min    =    $rule[0];$max    =    $rule[1];}else{list($min,$max)   =  explode(',',$rule);}return $type == 'between' ? $value>=$min && $value<=$max : $value<$min || $value>$max;case 'equal': // 验证是否等于某个值case 'notequal': // 验证是否等于某个值            return $type == 'equal' ? $value == $rule : $value != $rule;case 'length': // 验证长度$length  =  mb_strlen($value,'utf-8'); // 当前数据长度if(strpos($rule,',')) { // 长度区间list($min,$max)   =  explode(',',$rule);return $length >= $min && $length <= $max;}else{// 指定长度return $length == $rule;}case 'expire':list($start,$end)   =  explode(',',$rule);if(!is_numeric($start)) $start   =  strtotime($start);if(!is_numeric($end)) $end   =  strtotime($end);return NOW_TIME >= $start && NOW_TIME <= $end;case 'ip_allow': // IP 操作许可验证return in_array(get_client_ip(),explode(',',$rule));case 'ip_deny': // IP 操作禁止验证return !in_array(get_client_ip(),explode(',',$rule));case 'regex':default:    // 默认使用正则验证 可以使用验证类中定义的验证名称// 检查附加规则return $this->regex($value,$rule);}
}

以下是正则验证的方法$this->regex,返回正则验证的结果

/*** 使用正则验证数据* @access public* @param string $value  要验证的数据* @param string $rule 验证规则* @return boolean*/
public function regex($value,$rule) {$validate = array('require'   =>  '/\S+/','email'     =>  '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/','url'       =>  '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/','currency'  =>  '/^\d+(\.\d+)?$/','number'    =>  '/^\d+$/','zip'       =>  '/^\d{6}$/','integer'   =>  '/^[-\+]?\d+$/','double'    =>  '/^[-\+]?\d+(\.\d+)?$/','english'   =>  '/^[A-Za-z]+$/',);// 检查是否有内置的正则表达式if(isset($validate[strtolower($rule)]))$rule       =   $validate[strtolower($rule)];return preg_match($rule,$value)===1;
}

转载于:https://www.cnblogs.com/chenqionghe/p/4669650.html

thinkphp自动验证分析相关推荐

  1. php自动验证,ThinkPHP 自动验证及验证规则详解

    ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证.自动验证是基于数据对象的,而大多情况下数据对象是基于 $_POST表单 (不是绝对的)创建的. 基本 ...

  2. php字段验证规则,ThinkPHP 自动验证及验证规则详解

    ThinkPHP 自动验证及验证规则详解 ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证.自动验证是基于数据对象的,而大多情况下数据对象是基于 $_ ...

  3. php字段验证规则,详解ThinkPHP中自动验证及验证规则

    本篇文章详细介绍了thinkphp中自动验证及验证规则的方法,希望对学习thinkphp的朋友有帮助! 详解ThinkPHP中自动验证及验证规则 ThinkPHP 内置了数据对象的自动验证功能来完成模 ...

  4. php 自动验证表单类,thinkPHP 表单自动验证功能

    昨天晚上我们老大叫我弄表单自动验证功能,愁了半天借鉴了好多官网的知识,才出来,诶,总之分享一下我自己的成果吧! thinkphp 在Model基类为我们定义了自动验证的函数和正则表达式,我们只需要在对 ...

  5. php yanzhengm,ThinkPHP 在使用M方法(不创建模型类)时实现自动验证与自动填充

    ThinkPHP M方法实现自动验证与自动填充 通常,我们会将自动验证与自动填充规则写入模型类里,然后再用 D 方法实例化模型类来实现对表单的自动验证与自动填充功能.由于 M 方法只是实例化基础模型类 ...

  6. php 自动验证类,Thinkphp实现自动验证和自动完成

    这篇文章主要介绍了Thinkphp实现自动验证和自动完成的相关资料,需要的朋友可以参考下 Thinkphp的自动验证和自动完成都是根所表单提交的内容来的,对部分数据进行规则验证和处理后插入到数据库. ...

  7. php create()方法,ThinkPHP中create()方法自动验证实例

    ThinkPHP中create()方法自动验证实例2020-06-16 04:24:32 自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验 ...

  8. Thinkphp 源码分析

    Thinkphp 源码分析 ThinkPHP是国内非常火的一个轻量级框架,采用MVC模式,结构写的非常好,今天 大象 带大家走一下ThinkPHP框架系统运行流程,我将跟随ThinkPHP的执行进行代 ...

  9. php怎么弄自动填充,ThinkPHP 自动填充(自动完成)详解及实例

    ThinkPHP 自动填充 ThinkPHP 内置了数据对象的自动填充功能,可以用来处理默认值.数据过滤以及其他系统写入字段的自动处理. 要使用自动填充功能,只需要在对应的 Model类 里面定义 $ ...

最新文章

  1. c语言正数与负数相加_C语言数据基本类型(1)
  2. 含有PCA动画演示的帖子,需要多读几遍的经典
  3. 《VMware Virtual SAN权威指南(原书第2版)》一3.4 VSAN网络配置之vSphere分布式交换机...
  4. 介绍一个非常好用的Python模块-pprint模块,相信你一定会爱上它的
  5. Phonegap 极光推送api 服务器端推送代码
  6. Magento微信支付接口开发小记
  7. 拜登政府撤销对Tik Tok和Wechat禁令 启动对外国应用审查
  8. arcgis多个数据融合python_使用Python在ArcGIS中添加多个字段名
  9. Prewitt滤波器的实现,对比Prewitt滤波器和Sobel滤波器提取图像边缘的效果
  10. 数字图像处理第三版4.8.4例子GLPF高斯低通滤波器matlab程序
  11. matlab qam调制函数,matlab实现16QAM调制解调
  12. OFFICE Excel表格中常用的vba代码集锦
  13. 【Neo4j】CQL基本语法
  14. HTTPS证书文件格式转换
  15. 国瀚实业|打算投资理财,这些事要准备好
  16. P4414 [COCI2006-2007#2] ABC
  17. 天勤python_天勤量化
  18. 六级阅读真题词组(2016)
  19. 什么叫工业4.0,这篇接地气的文章终于讲懂了(ZT)
  20. 企业为什么要绘制用户画像?谈谈用户画像的真正作用

热门文章

  1. 以太坊PHP离线交易签名生成,以太坊web3.sendRawTransaction离线签名交易
  2. oracle goldengate 数据库实例,案例:Oracle goldengate报错ggsci: error while loading shared libraries:...
  3. PHP中三元运算符的用法_php 三元运算符实例详细介绍
  4. mysql要将语句反复执行15次_MySQL多表查询疑问
  5. php下的ssm模式,编码风格:Mvc模式下SSM环境,代码分层管理
  6. 关于在阅读nnUNet代码中的一些小细节的记录(二)
  7. 西瓜书《机器学习》线性模型 对数几率(逻辑)回归公式推导
  8. java代码发送http请求时DnsResolver使用问题
  9. Java的一些基础知识深入
  10. 转自:拜小白教你OpenCV3.2.0+VS2017开发环境配置