• 掌握Thinkphp3.2.0----自动验证


    自动验证是TP在create数据的时候,自动对数据进行验证。

    TP提供了两种验证方式:静态验证($_validate属性----自定义的模型的)和validate()方法

    1.静态验证-----$_validate属性

    总体的格式: 

     1 <?php  
     2     namespace HomeModel;
     3     use ThinkModel;
     4     class UserModel extends Model{
     5         
     6         protected $_validate = array(
     7             array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
     8                           .......多个字段验证
     9         );
    10     }
    11 ?>

      验证字段----验证规则-----错误提示-----验证条件-----附加规则----验证时间

    红色的是必选字段,黑色的是附加字段

    验证字段:顾名思义,就是需要验证的字段

    验证规则:系统内置或自定义的规则

    错误提示:在验证失败的时候做出的返回的信息

    验证条件:      

          1.self::EXISTS_VALIDATE 或 0,表示存在字段就验证(默认) ;
          2.self::MUST_VALIDATE 或 1,表示必须验证;
          3.self::VALUE_VALIDATE 或 2,表示值不为空的时候验证。

    附近规则:

          配合验证规则使用,包括一下规则:

    验证时间:

    主要新增修改等验证。
    1.self::MODEL_INSERT 或 1 新增数据时验证;
    2.self::MODEL_UPDATE 或 2 编辑数据时验证;
    3.self::MODEL_BOTH 或 3 全部情况下验证(默认)。

    自动验证是从上到下以此验证,上面的错误,下面不会有错误信息返回

    其实自动验证是很简单的,熟悉规则之后来看一下实例:

    内置验证规则:

     1 模型
     2 <?php  
     3     namespace HomeModel;
     4     use ThinkModel;
     5     class UserModel extends Model{
     6         
     7         //系统支持数据的批量验证功能,只需要在模型类里面设置patchValidate属性为true( 默认为false),
     8         //设置批处理验证后,getError() 方法返回的错误信息是一个数组
     9         protected $patchValidate = true;
    10         protected $_validate = array(
    11 
    12             //为了便于模拟,我用的是验证条件是1,也就是在任何条件下都验证,其实所用的字段可能是不存在的
    13             //是不能够创建数据的
    14             //内置验证require不能为空
    15             array('require','require','数据不能为空!',1),
    16             //内置验证email,验证邮箱格式
    17             array('email','email','邮箱格式不正确',1),
    18             //内置验证url,验证网址
    19             array('url','url','URL地址不正确',1),
    20             //内置验证currency,验证货币
    21             array('currency','currency','货币格式不正确',1),
    22             //内置验证zip,验证邮编
    23             array('zip','zip','邮政编码不正确',1),
    24             //内置验证number,验证是不是正整数
    25             array('number','number','不是正整数',1),
    26             //内置验证integer,验证是不是整数
    27             array('integer','integer','不是整数',1),
    28             //内置验证double,验证是不是浮点数,正负均可
    29             array('double','double','不是浮点数',1),
    30             //内置验证english,验证是不是纯英文
    31             array('english','english','不是纯英文',1),
    32         );
    33     }
    34 ?>
    35 
    36 
    37 控制器:
    38 
    39 <?php
    40 // 本类由系统自动生成,仅供测试用途
    41 namespace HomeController;
    42 use ThinkController;
    43  use CommonModelUserModel;
    44 class IndexController extends Controller {
    45 
    46     public function index(){
    47 
    48         $user = D('User');
    49 
    50         //用数组的方式模拟数据的提交
    51         $data['require'] = '';
    52         $data['email'] = 'sjdjjd';
    53         $data['url'] = 'aaa';
    54         $data['currency'] = '-1.2';
    55         $data['zip'] = '123';
    56         $data['number'] = -1;
    57         $data['integer'] = -1.2;
    58         $data['double'] = '21s';
    59         $data['english'] = '12ee';
    60         if($user->create($data)){
    61             echo "验证成功!";
    62         }else{
    63             var_dump($user->getError());
    64         }
    65     }
    66 }

    结果:

    附加:

     1 //附加规则regex,验证3-6位纯数字
     2 array('user', '/^d{3,6}$/', '不是 3-6 位纯正数字', 0, 'regex'),
     3 //附加规则equal,验证是否和指定值相等
     4 array('user', '李炎恢', '值不对等', 0, 'equal'),
     5 //附加规则notequal,验证是否与指定值不等
     6 array('user', '李炎恢', '值不能相等', 0, 'notequal'),
     7 //附加规则confirm,验证两条字段是否相同
     8 array('user', 'name', '两个用户名对比不同!',0,'confirm'),
     9 //附加规则in,某个范围,可以是数组或逗号分割的字符串
    10 array('user',  array(1,2,3), '不在指定范围', 0, 'in'),
    11 array('user', '张三,李四,王五', '不在指定范围', 0, 'in'),
    12 //附加规则notin,某个范围,可以是数组或逗号分割的字符串
    13 array('user',  array(1,2,3), '不得在指定范围', 0, 'notin'),
    14 array('user', '张三,李四,王五', '不得在指定范围', 0, 'notin'),
    15 //附加规则length,验证长度或数字范围
    16 array('user', '3', '不得小于 3 位', 0, 'length'),
    17 array('user', '3,5', '不得小于 3 位,不得大于 5 位', 0, 'length'),
    18 //附加规则between,验证某个范围,数字或逗号字符串
    19 array('user',  array(3,5), '必须是 3-5 之间的数字', 0, 'between'),
    20 array('user', '3,5', '必须是 3-5 之间的数字', 0, 'between'),
    21 //附加规则notbetween,验证某个范围,数字或逗号字符串
    22 array('user',  array(3,5), '必须不是 3-5 之间的数字', 0, 'notbetween'),
    23 array('user', '3,5', '必须不是 3-5 之间的数字', 0, 'notbetween'),
    24 //附加规则expire,设置有效期范围,必须是表单提交有效,可以是时间戳
    25 array('user', '2014-1-10,2015-10-10', '时间已过期', 0, 'expire'),
    26 //附加规则ip_deny,IP禁止列表
    27 array('user', '127.0.0.1', '当前 IP 被禁止', 0, 'ip_deny'),
    28 //附加规则ip_allow,IP允许列表
    29 array('user', '127.0.0.1', '当前 IP 没有被允许', 0, 'ip_allow'),
    30 //附加规则callback,回调验证
    31 array('user', 'checkLength', '用户名必须在 3-5 位', 0, 'callback', 3,
    32 array(3,5)),
    33 //回调方法
    34 protected n function checkLength($str,$min,$max) {
    35 preg_match_all("/./u", $str, $matches);
    36 $len = count($matches[0]);
    37 if ($len < $min || $len > $max) {
    38 return  false;
    39 }  else {
    40 return  true;
    41 }
    42 }
    43 //附加规则function,函数验证
    44 array('user', 'checkLength', '用户名必须在 3-5 位', 0, 'function', 3,
    45 array(3,5)),
    46 //在 Common 文件夹下的 Common 文件夹建立 function.php 文件,会自动加载
    47 function checkLength($str,$min,$max) {
    48 preg_match_all("/./u", $str, $matches);
    49 $len = count($matches[0]);
    50 if ($len < $min || $len > $max) {
    51 return  false;
    52 } e else {
    53 n return  true;
    54 }
    55 }
    56 如果有多个字段都包含错误,默认只显示一个错误。如果想显示全部错误,可以设置属
    57 性:
    58 //批量验证
    59 d protected $patchValidate =  true;
    60 如果是直接 POST 过来的,直接使用 create()方法即可。
    61 //控制器create()方法自动调用验证
    62 $user = D('User');
    63 if ($user->create()) {
    64 echo '所有数据验证成功!';
    65 }  else {
    66 //输出错误信息
    67 var_dump($user->getError());
    68 }
    69 PS:由于使用的 UserModel 模型类,所以必须是 D()方法实例化。
    70 如果想把错误信息返回给ajax处理,可以是同ajaxReturn()方法返回JSON数据。
    71 //返回JSON格式
    72 $this->ajaxReturn($user->getError());
    73 //1指定新增数据验证,2表示修改,
    74 f if ($user->create($_POST,1)) {} //一般会自动判断

    回调和函数是终极的自定义,还是很强大的

    2.动态验证----动态验证就是把验证的规则放在控制器端,这样,在操作的时候比较灵活,缺点就是比较混乱。

     1 //动态验证
     2 $rule =  array(
     3 array('user', 'require', '用户名不得为空'),
     4 );
     5 $user = M('User');
     6 $data['user'] = '';
     7 if ($user->validate($rule)->create($data)) {
     8 echo '验证所有字段成功!';
     9 } e else {
    10 var_dump($user->geterror());
    11 }
  • 相关阅读:
    Boost中timer的简易用法
    poj 2586 Y2K Accounting Bug(贪心算法,水题一枚)
    Steps to Install Hadoop on CentOS/RHEL 6---reference
    nginx多进程模型之配置热加载---转
    C/C++ unit testing tools (39 found)---reference
    centos复制到另外一台电脑连不上网
    linux man使用方法 和centos安装中文man包 --转
    centos6.4使用man查找命令时,报错No manual entry for xxxx
    How to Install and Configure Nginx from Source on centos--转
    研磨设计模式之 策略模式--转
  • 原文地址:https://www.cnblogs.com/zhengfengyun/p/6135096.html
Copyright © 2020-2023  润新知