php 自定义验证器一:了解原始原始结构
注意事项
1.规定验证器格式 $validate->rule($rule)->message($message)->check($data)
2.验证器思路:需要验证的字段,启用某条规则,验证字段的限定值,它的提示信息
3.返回的错误提示。返回全部错误,或者取一条返回
$data = [ 'name'=>1, ]; $message = ['require'=>'名称不能为空','number'=>'必须为数字','max'=>'最大值为12','min'=>'最小值为4']; $rule = ['require'=>'','number'=>'','max'=>12,'min'=>4];
// 开始验证 $this->checkItem('name',$rule,$data['name'],$message);
实际操作:
验证器类 Validate.php
<?php namespace framework\library; class Validate { /** * 当前验证规则 * @var array */ protected $rule = []; /** * 验证提示信息 * @var array */ protected $message = []; /** * 错误信息 * @var array * */ protected $error = []; /** * 验证正则定义 * @var array */ protected $regex = []; /** * 内置正则验证规则 * @var array * @example * alpha 纯字母 * alphaNum 字母和数字 * alphaDash 字母和数字,下划线_及破折号- * chs 汉字 * chsAlpha 汉字、字母 * chsAlphaNum 汉字、字母和数字 * chsDash 汉字、字母、数字和下划线_及破折号- * idCard 身份证格式 * zip 邮政编码 */ protected $defaultRegex = [ 'alpha' => '/^[A-Za-z]+$/', 'alphaNum' => '/^[A-Za-z0-9]+$/', 'alphaDash' => '/^[A-Za-z0-9\-\_]+$/', 'chs' => '/^[\x{4e00}-\x{9fa5}]+$/u', 'chsAlpha' => '/^[\x{4e00}-\x{9fa5}a-zA-Z]+$/u', 'chsAlphaNum' => '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u', 'chsDash' => '/^[\x{4e00}-\x{9fa5}a-zA-Z0-9\_\-]+$/u', 'mobile' => '/^1[3-9]\d{9}$/', 'idCard' => '/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/', 'zip' => '/\d{6}/', ]; /** * Filter_var 规则 * @var array */ protected $filter = [ 'email' => FILTER_VALIDATE_EMAIL, 'ip' => [FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6], 'integer' => FILTER_VALIDATE_INT, 'url' => FILTER_VALIDATE_URL, 'macAddr' => FILTER_VALIDATE_MAC, 'float' => FILTER_VALIDATE_FLOAT, ]; /** * 验证规则 * */ public function rule($rule){ $this->rule = $rule; return $this; } /** * 设置提示信息 * @access public * @param array $message 错误信息 * @return Validate */ public function message(array $message) { $this->message = array_merge($this->message, $message); return $this; } /** * 获取所有错误信息 * */ private function getAllError(){ return $this->error; } /** * 抛出错误信息 * */ public function getError(){ // 取第一个数组中的第一个值 $msg = array_shift(array_shift($this->error)); exit($msg); } // 验证器的原始结构 public function checkOne(){ $data = [ 'name'=>1, ]; $message = ['require'=>'名称不能为空','number'=>'必须为数字','max'=>'最大值为12','min'=>'最小值为4']; $rule = ['require'=>'','number'=>'','max'=>12,'min'=>4]; $this->checkItem('name',$rule,$data['name'],$message); } /** * 验证单个字段规则 * 需要验证的字段,启用某条规则,该字段的限定值,它的提示信息 * @access protected * @param string $field 字段名 * @param mixed $rules 验证规则 * @param mixed $value 字段值 * @param array $message 提示信息 * @return mixed */ public function checkItem(string $field,$rules,$value,$message ='') { foreach($rules as $k=>$v){ $result = $this->is($k,$value,$v); if($result ===false){ if(isset($message[$k])){ $errorMsg = $message[$k]; }else{ $errorMsg = "请设置字段 {$field} 的错误提示"; } $this->error[$field][] = $errorMsg; } } return $this->error; } /** * 验证字段值是否为有效格式 * @access public * @param string $rule 验证规则 * @param mixed $value 字段值 * @param array $data 验证规则限定的值 * @return bool */ public function is(string $rule,$value, $data = '') { $result = false; switch ($rule){ case 'require': // 必须有参数 if(!empty($value)){ $result = true; } break; case 'number': // 必须为数字 if(is_numeric($value)) $result = true; break; case 'length': if (is_string($data)) { $data = explode(',', $data); } if(is_array($value)){ $length = count($value); }else{ $length = mb_strlen((string) $value); } if($length>=$data[0] && $length<=$data[1]) $result = true; break; case 'max': if($data >= $value ) $result = true; break; case 'min': if($data <= $value) $result = true; break; case 'between': if (is_string($data)) { $data = explode(',', $data); } if($value >= $data[0] && $value <= $data[1]) $result = true; break; case 'notbetween': if (is_string($data)) { $data = explode(',', $data); } if($value < $data[0] || $value > $data[1]) $result = true; break; case 'in': if (is_string($data)) { $data = explode(',', $data); } if(in_array($value,$data)) $result = true; break; case 'notin': if (is_string($data)) { $data = explode(',', $data); } if(!in_array($value,$data)) $result = true; break; case 'confirm': if($value ==$data) $result = true; break; default: // 调用其他验证规则 if (isset($this->filter[$rule])) { // Filter_var验证规则 $result = $this->filter($value, $this->filter[$rule]); } else { // 正则验证 $result = $this->regex($value, $rule); } } return $result; } /** * 使用正则验证数据 * @access public * @param mixed $value 字段值 * @param mixed $rule 验证规则 正则规则或者预定义正则名 * @return bool */ public function regex($value, $rule): bool { if (isset($this->regex[$rule])) { $rule = $this->regex[$rule]; } elseif (isset($this->defaultRegex[$rule])) { $rule = $this->defaultRegex[$rule]; } if (is_string($rule) && 0 !== strpos($rule, '/') && !preg_match('/\/[imsU]{0,4}$/', $rule)) { // 不是正则表达式则两端补上/ $rule = '/^' . $rule . '$/'; } return is_scalar($value) && 1 === preg_match($rule, (string) $value); } /** * 使用filter_var方式验证 * @access public * @param mixed $value 字段值 * @param mixed $rule 验证规则 * @return bool */ public function filter($value, $rule): bool { if (is_string($rule) && strpos($rule, ',')) { [$rule, $param] = explode(',', $rule); } elseif (is_array($rule)) { $param = $rule[1] ?? null; $rule = $rule[0]; } else { $param = null; } return false !== filter_var($value, is_int($rule) ? $rule : filter_id($rule), $param); } }
控制器调用:
public function v4(){ $validate = new Validate(); $validateResult = $validate->checkOne(); print_r($validate->getError()); }