php 自定义验证器一:了解原始原始结构
注意事项
1.规定验证器格式 rule)->message(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()); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架