• 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 frameworklibrary;
    
    
    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());
        }
    99999999
  • 相关阅读:
    云计算解决方案百度文库
    【QA5】【mysql问题】ERROR 1045 (28000): Access denied for...
    linux系统管理 简单常用命令
    【QA4】【sudoers问题解决】(*** is not in the sudoers file.This incident will be reported)
    自动化测试框架实践1autotest
    Syndication命名空间实现RSS功能学习
    Javascript中撤销方法
    asp.net 中一次性更新所有GRIDVIEW的记录(转)
    Oralce 一次执行多条语句
    asp.net 防注入式攻击
  • 原文地址:https://www.cnblogs.com/wesky/p/14336177.html
Copyright © 2020-2023  润新知