自动验证是TP在create数据的时候,自动对数据进行验证。
TP提供了两种验证方式:静态验证($_validate属性----自定义的模型的)和validate()方法
1.静态验证-----$_validate属性
总体的格式:
1 <?php 2 namespace Home\Model; 3 use Think\Model; 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 Home\Model; 4 use Think\Model; 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 Home\Controller; 42 use Think\Controller; 43 use Common\Model\UserModel; 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 }