私人领地

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());
    }

 

posted @ 2021-01-27 17:51  狂奔的蜗牛Snails  阅读(118)  评论(0编辑  收藏  举报