PHP code example of webgeeker / validation

1. Go to this page and download the library: Download webgeeker/validation library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

webgeeker / validation example snippets


$params = $request->query(); // 获取GET参数

// 验证(如果验证不通过,会抛出异常)
Validation::validate($params, [
    "offset" => "IntGe:0",  // 参数"offset"必须是大于等于0的整数
    "count" => "Required|IntGeLe:1,200",  // 参数"count"是必需的且取值在 1 - 200 之间
]);

//验证规则
$validations = [
    "offset" => "IntGe:0", // 参数offset应该大于等于0
    "count" => "Required|IntGeLe:1,200", // 参数count是必需的且大于等于1小于等于200
    "type" => "IntIn:1,2", // 参数type可取值为: 1, 2
    "state" => [
        'IfIntEq:type,1|IntEq:0', // 如果type==1(批评建议),那么参数state只能是0
        'IfIntEq:type,2|IntIn:0,1,2', // 如果type==2(用户投诉),那么参数state可取值为: 1, 2, 3
    ],
    "search.keyword" => "StrLenGeLe:1,100", // search.keyword 应该是一个长度在[1, 100]之间的字符串
    "search.start_time" => "Date", // search.start_time 应该是一个包含合法日期的字符串
    "search.end_time" => "Date", // search.end_time 应该是一个包含合法日期的字符串
];

// 待验证参数
$params = [
    "offset" => 0, // 从第0条记录开始
    "count" => 10, // 最多返回10条记录
    "type" => 2, // 1-批评建议, 2-用户投诉
    "state" => 0, // 0-待处理, 1-处理中, 2-已处理
    "search" => [ // 搜索条件
        "keyword" => '硬件故障', // 关键字
        "start_time" => "2018-01-01", // 起始日期
        "end_time" => "2018-01-31", // 结束日期
    ],
];

// 验证(如果验证不通过,会抛出异常)
Validation::validate($params, $validations);


WebGeeker\Validation\Validation;

try {
    Validation::validate($_POST, [
        "offset" => "IntGe:0", // 参数offset应该大于等于0
        "count" => "Required|IntGeLe:1,200", // 参数count是必需的且大于等于1小于等于200
    ]);
} catch (\Exception $e) {
    echo $e->getMessage();
}

//$params = $request->query(); // 获取GET参数
$params = $request->request->all(); // 获取POST参数

// 验证(如果验证不通过,会抛出异常)
Validation::validate($params, [
    // 此处省略验证规则
]);

"size" => "IntGeLe:1,100"

"height" => "FloatGeLe:0.0,100.0"

"accept" => "BoolSmart"

"name" => "StrLenGeLe:2,20"

"comment" => "ByteLenLe:1048576"

"email" => "Email"

"phone" => "Regexp:/^1(3[0-9]|4[579]|5[0-35-9]|7[0135678]|8[0-9]|66|9[89])\d{8}$/"

"file" => "FileMaxSize:10m|FileImage"

"size" => "Required|StrIn:small,middle,large"

$validations = [
    "name" => "Required|StrLenGeLe:2,20",
    "sex" => "Required|IntIn:0,1",
    "age" => "Required|IntGeLe:1,200",
];

$userInfo = [
    "name" => "tom",
    "sex" => "0",
    "age" => "10",
];
Validation::validate($userInfo, $validations); // 创建用户时的验证

unset($userInfo["age"]); // 删除age字段
Validation::validate($userInfo, $validations, true); // 更新用户信息时的验证

$params = [
    "comments" => [
        [
            "title" => "title 1",
            "content" => "content 1",
        ],
        [
            "title" => "title 1",
            "content" => "content 1",
        ],
        [
            "title" => "title 1",
            "content" => "content 1",
        ],
    ]
];

$validations = [
    "comments[*].title" => "Required|StrLenGeLe:2,50",
    "comments[*].content" => "Required|StrLenGeLe:2,500",
];

Validation::validate($params, $validations);

$validations = [
    "sex" => "StrIn:male,female",
    "height" => [
        "IfStrEq:sex,male|IntGe:180",
        "IfStrEq:sex,female|IntGe:170",
    ],
];

"IfExist:sex|IfStrEq:sex,male|IntGe:180"

"type" => [
    "StrIn:small,middle,large",
    "IntIn:1,2,3",
]

$params = [
    "name" => "hello",
];

$params = [
    "name" => "hello",
    "comment" => null,
];

$params = [
    "p1" => "",
    "p2" => "hello",
    "p3" => "123",
];

$params = [
    "title" => "a",
];

Validation::validate($params, [
    "title" => "Required|StrLenGeLe:2,50",
]); // 抛出异常的错误描述为:“title”长度必须在 2 - 50 之间

Validation::validate($params, [
    "title" => "Required|StrLenGeLe:2,50|Alias:标题", // 自定义参数名称
]); // 抛出异常的错误描述为:“标题”长度必须在 2 - 50 之间

Validation::validate($params, [
    "title" => "Required|StrLenGeLe:2,50|>>>:标题长度应在2~50之间", // 自定义错误信息描述文本
]); // 抛出异常的错误描述为:标题长度应在2~50之间

class MyValidation extends Validation
{
    // “错误提示信息模版”翻译对照表
    protected static $langCodeToErrorTemplates = [
        "zh-tw" => [
            'Int' => '“{{param}}”必須是整數', // 🌝
            'IntGt' => '“{{param}}”必須大於 {{min}}',
            'Str' => '“{{param}}”必須是字符串',
        ],
        "en-us" => [
            'Int' => '{{param}} must be an integer',
            'IntGt' => '{{param}} must be greater than {{min}}',
            'Str' => '{{param}} must be a string',
        ],
    ];

    // 文本翻译对照表
    protected static $langCodeToTranslations = [
        "zh-tw" => [
            "变量" => "變量", // 🌙
            "变量必须是整数" => "變量必須是整數", // ⭐
        ],
        "en-us" => [
            "变量" => "variable",
            "变量必须是整数" => "variable must be an integer",
        ],
    ];
}

MyValidation::setLangCode("zh-tw"); // 设置语言代码

MyValidation::validate(["var" => 1.0], [
    "var" => "Int", // 既没有Alias,也没有>>>,只会翻译错误提示信息模版(对应🌝那行)
]); // 会抛出异常:“var”必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|Alias:变量", // 有Alias,除了翻译错误提示信息模版外,还会翻译参数名称(对应🌙那行)
]); // 会抛出异常:“變量”必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|>>>:变量必须是整数", // 有>>>,会翻译自定义错误描述文本(对应⭐那行)
]); // 会抛出异常:變量必須是整數

class MyValidation extends Validation
{
    // “错误提示信息模版”翻译对照表
    protected static $langCodeToErrorTemplates = [
        "zh-tw" => [
            "“{{param}}”必须是整数" => "“{{param}}”必須是整數", // 🌝
            "“{{param}}”必须是字符串" => "“{{param}}”必須是字符串",
        ],
        "en-us" => [
            "“{{param}}”必须是整数" => "{{param}} must be a integer",
            "“{{param}}”必须是字符串" => "{{param}} must be a string",
        ],
    ];

    // 文本翻译对照表
    protected static $langCodeToTranslations = [
        "zh-tw" => [
            "变量" => "變量", // 🌙
            "变量必须是整数" => "變量必須是整數", // ⭐
        ],
        "en-us" => [
            "变量" => "variable",
            "变量必须是整数" => "variable must be an integer",
        ],
    ];
}

MyValidation::setLangCode("zh-tw"); // 设置语言代码

MyValidation::validate(["var" => 1.0], [
    "var" => "Int", // 既没有Alias,也没有>>>,只会翻译错误提示信息模版(对应🌝那行)
]); // 会抛出异常:“var”必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|Alias:变量", // 有Alias,除了翻译错误提示信息模版外,还会翻译参数名称(对应🌙那行)
]); // 会抛出异常:“變量”必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|>>>:变量必须是整数", // 有>>>,会翻译自定义错误描述文本(对应⭐那行)
]); // 会抛出异常:變量必須是整數

// 本类实现了自定义验证器 CustomStartWith 用于验证参数是否以指定前缀开头
class CustomCaseValidation extends Validation
{
    // 验证失败时的错误提示信息的模版。子类的模版在运行时会与父类的模版 $errorTemplates 合并,如果出现同名的键,子类的值会覆盖父类的值
    protected static $errorTemplates = [
        'CustomStartWith' => '“{{param}}”必须以"{{prefix}}"开头"',
    ];

    /**
     * 自定义验证器"CustomStartWith"的实现方法,验证输入参数 $value 是否以指定前缀开头
     *
     * @param $value string 待验证的值
     * @param $prefix string 前缀。如果验证器为"CustomStartWith:head",则本参数的值为"head"
     * @param $reason string|null 验证失败的错误提示字符串. 如果为null, 需要自动生成
     *        如果验证中包含了伪验证器">>>:some reason",本参数值为"some reason",
     *        如果没有提供伪验证器">>>",本参数值为null
     * @param $alias string 参数别名, 用于错误提示。
     *        如果验证中包含了伪验证器"Alias:姓名",则本参数值为"姓名"
     *        如果没有提供"Alias",比如"name" => "StrLenGeLe:2,30",本参数值为"name"
     * @return mixed 返回参数 $value 的原值
     * @throws ValidationException 验证失败抛出异常
     */
    public static function validateCustomStartWith($value, $prefix, $reason, $alias)
    {
        if (strpos(strval($value), $prefix) === 0)
            return $value;

        if ($reason !== null)
            throw new ValidationException($reason);

        $error = self::getErrorTemplate('CustomStartWith'); // 获取错误提示信息模版
        $error = str_replace('{{param}}', $alias, $error);
        $error = str_replace('{{prefix}}', $prefix, $error);
        throw new ValidationException($error);
    }
}

'name' => 'CustomStartWith:head'

/**
 * 自定义验证器示例类Demo
 *
 * 本类实现了以下自定义验证器:
 * CustomInt 用于验证参数是否是整数
 * CustomIntEq 用于验证参数是否是整数,并且与指定数值相等
 * CustomIntGeLe 用于验证参数是否是整数,并且其值在[min, max]之间
 */
class CustomDemoValidation extends CustomCaseValidation
{
    /**
     * @var array 验证失败时的错误提示信息的模版。
     *      子类的模版在运行时会与父类的 $errorTemplates 合并,
     *      如果出现同名的键, 子类的值会覆盖父类的值
     */
    protected static $errorTemplates = [
        'CustomInt' => '“{{param}}”必须是Custom整数',
        'CustomIntEq' => '“{{param}}”必须等于 {{value}}',
        'CustomIntGeLe' => '“{{param}}”必须大于等于 {{min}} 小于等于 {{max}}',
    ];

    /**
     * 自定义验证器"CustomInt"的实现方法
     *
     * @param $value string 待验证的值
     * @param $reason string|null 验证失败的错误提示字符串. 如果为null, 需要自动生成
     * @param $alias string 参数别名, 用于错误提示。
     * @return mixed 返回参数 $value 的原值
     * @throws ValidationException 验证失败抛出异常
     */
    public static function validateCustomInt($value, $reason, $alias)
    {
        $type = gettype($value);
        if ($type === 'string') {
            if (is_numeric($value) && strpos($value, '.') === false)
                return $value;
        } elseif ($type === 'integer') {
            return $value;
        }

        if ($reason !== null)
            throw new ValidationException($reason);

        $error = self::getErrorTemplate('CustomInt');
        $error = str_replace('{{param}}', $alias, $error);
        throw new ValidationException($error);
    }

    /**
     * 自定义验证器"CustomIntEq"的实现方法。
     * 检测 $value 与 $equalVal 是否相等。
     *
     * @param $value string 待验证的值
     * @param $equalVal string 要比较的值
     * @param $reason string|null 验证失败的错误提示字符串. 如果为null, 需要自动生成
     * @param $alias string 参数别名, 用于错误提示。
     * @return mixed 返回参数 $value 的原值
     * @throws ValidationException 验证失败抛出异常
     */
    public static function validateCustomIntEq($value, $equalVal, $reason, $alias)
    {
        $type = gettype($value);
        if ($type === 'string') {
            if (is_numeric($value) && strpos($value, '.') === false) {
                $val = intval($value);
                if ($val == $equalVal)
                    return $value;
                $isTypeError = false;
            } else
                $isTypeError = true;
        } elseif ($type === 'integer') {
            if ($value == $equalVal)
                return $value;
            $isTypeError = false;
        } else
            $isTypeError = true;

        if ($reason !== null)
            throw new ValidationException($reason);

        if ($isTypeError) {
            $error = self::getErrorTemplate('CustomInt');
            $error = str_replace('{{param}}', $alias, $error);
        } else {
            $error = self::getErrorTemplate('CustomIntEq');
            $error = str_replace('{{param}}', $alias, $error);
            $error = str_replace('{{value}}', $equalVal, $error);
        }
        throw new ValidationException($error);
    }

    /**
     * 自定义验证器"CustomIntGeLe"的实现方法。
     * 检测 $value 取值是否在[$min, $max]之间。
     *
     * @param $value string 待验证的值
     * @param $min string 最小值
     * @param $max string 最大值
     * @param $reason string|null 验证失败的错误提示字符串. 如果为null, 需要自动生成
     * @param $alias string 参数别名, 用于错误提示。
     * @return mixed 返回参数 $value 的原值
     * @throws ValidationException 验证失败抛出异常
     */
    public static function validateCustomIntGeLe($value, $min, $max, $reason, $alias)
    {
        $type = gettype($value);
        if ($type === 'string') {
            if (is_numeric($value) && strpos($value, '.') === false) {
                $val = intval($value);
                if ($val >= $min && $val <= $max)
                    return $value;
                $isTypeError = false;
            } else
                $isTypeError = true;
        } elseif ($type === 'integer') {
            if ($value >= $min && $value <= $max)
                return $value;
            $isTypeError = false;
        } else
            $isTypeError = true;

        if ($reason !== null)
            throw new ValidationException($reason);

        if ($isTypeError) {
            $error = self::getErrorTemplate('CustomInt');
            $error = str_replace('{{param}}', $alias, $error);
        } else {
            $error = self::getErrorTemplate('CustomIntGeLe');
            $error = str_replace('{{param}}', $alias, $error);
            $error = str_replace('{{min}}', $min, $error);
            $error = str_replace('{{max}}', $max, $error);
        }
        throw new ValidationException($error);
    }
}

explode(',', $paramString)

protected static function parseParamsOfCustomFloatGtLt($paramString) {}

/**
 * 自定义验证器示例类Example
 *
 * 本类实现了以下自定义验证器:
 * CustomFloatGtLt 用于验证参数是否是浮点数,并且其值在(min, max)之间
 */
class CustomExampleValidation extends Validation
{
    /**
     * @var array 验证失败时的错误提示信息的模版。
     *      子类的模版在运行时会与父类的 $errorTemplates 合并,
     *      如果出现同名的键, 子类的值会覆盖父类的值
     */
    protected static $errorTemplates = [
        'CustomFloatGtLt' => '“{{param}}”必须大于 {{min}} 小于 {{max}}',
    ];

    /**
     * @var \string[][] “错误提示信息模版” $errorTemplates 的翻译对照表
     *      子类的翻译对照表在运行时会与父类的 $langCode2ErrorTemplates (递归)合并,
     *      如果出现同名的键, 子类的值会覆盖父类的值
     */
    protected static $langCode2ErrorTemplates = [
        "zh-tw" => [
            'CustomFloatGtLt' => '“{{param}}”必須大於 {{min}} 小於 {{max}}',
        ],
        "en-us" => [
            'CustomFloatGtLt' => '{{param}} must be greater than {{min}} and less than {{max}}',
        ],
    ];

    /**
     * 自定义验证器"CustomFloatGtLt"的参数解析方法
     *
     * 假设验证器为"CustomFloatGtLt:1.0,10"
     * 则 $paramString = "1.0,10"
     * 本函数返回值为: [1.0, 10.0]
     *
     * @param $paramString string 验证器的参数
     * @return array 返回解析后的参数的数组。数组的长度就是验证器的
     *        参数个数,必须与对应的 validateCustomFloatGtLt() 方法的参数个数匹配。
     * @throws ValidationException 参数解析失败抛出异常
     */
    protected static function parseParamsOfCustomFloatGtLt($paramString)
    {
        $vals = explode(',', $paramString);
        if (count($vals) !== 2)
            throw new ValidationException("自定义验证器 CustomFloatGtLt 格式错误. 正确格式示例: CustomFloatGtLt:1.0,2.0");
        $p1 = $vals[0];
        $p2 = $vals[1];
        if (is_numeric($p1) === false || is_numeric($p2) === false)
            throw new ValidationException("自定义验证器 CustomFloatGtLt 参数类型错误. 正确的示例: CustomFloatGtLt:1.0,2.0");
        return [$p1, $p2];
    }

    /**
     * 自定义验证器"CustomFloatGtLt"的验证方法的实现
     *
     * @param $value mixed 待验证的值
     * @param $min float 最小值。对应上面的 parseParamsOfCustomFloatGtLt() 方法
     *        返回的数组的第0个元素($p1)
     * @param $max float 最大值。对应上面的 parseParamsOfCustomFloatGtLt() 方法
     *        返回的数组的第1个元素($p2)
     * @param $reason string|null 验证失败的错误提示字符串. 如果为null, 需要自动生成
     * @param $alias string 参数别名, 用于错误提示。
     * @return mixed 返回参数 $value 的原值
     * @throws ValidationException 验证失败抛出异常
     */
    public static function validateCustomFloatGtLt($value, $min, $max, $reason, $alias)
    {
        $type = gettype($value);
        if ($type === 'string') {
            if (is_numeric($value)) {
                $val = floatval($value);
                if ($val > $min && $val < $max)
                    return $value;
                $isTypeError = false;
            } else
                $isTypeError = true;
        } elseif ($type === 'double' || $type === 'integer') {
            if ($value > $min && $value < $max)
                return $value;
            $isTypeError = false;
        } else
            $isTypeError = true;

        if ($reason !== null)
            throw new ValidationException($reason);

        if ($isTypeError) {
            $error = '“{{param}}”必须是浮点数';
            $error = str_replace('{{param}}', $alias, $error);
        } else {
            $error = self::getErrorTemplate('CustomFloatGtLt');
            $error = str_replace('{{param}}', $alias, $error);
            $error = str_replace('{{min}}', $min, $error);
            $error = str_replace('{{max}}', $max, $error);
        }
        throw new ValidationException($error);
    }
}

/**
 * 自定义验证器示例类Sample
 *
 * 本类实现了以下自定义验证器:
 * CustomStrIn 用于验证参数是否是字符串,并且其取值是指定的几个字符串之一
 */
class CustomSampleValidation extends Validation
{
    /**
     * @var array 验证失败时的错误提示信息的模版。
     *      子类的模版在运行时会与父类的 $errorTemplates 合并,
     *      如果出现同名的键, 子类的值会覆盖父类的值
     */
    protected static $errorTemplates = [
        'CustomStrIn' => '“{{param}}”只能取这些值: {{valueList}}',
    ];

    /**
     * @var \string[][] 文本翻译对照表
     *      子类的文本翻译对照表在运行时会与父类的 $langCodeToTranslations (递归)合并,
     *      如果出现同名的键, 子类的值会覆盖父类的值
     */
    protected static $langCodeToTranslations = [
        "zh-tw" => [
            "状态" => "狀態",
        ],
        "en-us" => [
            "状态" => "status",
        ],
    ];

    /**
     * 自定义验证器"CustomStrIn"的参数解析方法
     *
     * 假设验证器为"CustomStrIn:pending,started,success,failed"
     * 则 $paramString = "pending,started,success,failed"
     * 则本函数返回值为(数组的数组): [
     *     ['pending', 'started', 'success', 'failed']
     * ]
     * 返回"数组的数组"可以实现验证器的参数个数可变。
     *
     * @param $paramString string 验证器的参数
     * @return array 返回解析后的参数的数组。数组的长度就是验证器的
     *        参数个数,必须与对应的 validateCustomStrIn() 方法的参数个数匹配。
     */
    protected static function parseParamsOfCustomStrIn($paramString)
    {
        $list = explode(',', $paramString);
        return [$list]; // 注意这里返回的是数组的数组
    }

    /**
     * 自定义验证器"CustomStrIn"的验证方法的实现
     *
     * @param $value mixed 待验证的值
     * @param $valueList string[] 可取值的列表。
     *        对应上面的 parseParamsOfCustomStrIn() 方法返回的数组的第0个元素($list)
     * @param $reason string|null 验证失败的错误提示字符串. 如果为null, 需要自动生成
     * @param $alias string 参数别名, 用于错误提示。
     * @return mixed 返回参数 $value 的原值
     * @throws ValidationException 验证失败抛出异常
     */
    public static function validateCustomStrIn($value, $valueList, $reason, $alias)
    {
        if (is_array($valueList) === false || count($valueList) === 0)
            throw new ValidationException("“${alias}”参数的验证模版(StrIn:)格式错误, 必须提供可取值的列表");

        if (is_string($value)) {
            if (in_array($value, $valueList, true))
                return $value;
            $isTypeError = false;
        } else
            $isTypeError = true;

        if ($reason !== null)
            throw new ValidationException($reason);

        if ($isTypeError) {
            $error = '“{{param}}”必须是Custom字符串';
            $error = str_replace('{{param}}', $alias, $error);
        } else {
            $error = self::getErrorTemplate('CustomStrIn');
            $error = str_replace('{{param}}', $alias, $error);
            $error = str_replace('{{valueList}}', '"'.implode('", "', $valueList).'"', $error);
        }

        throw new ValidationException($error);
    }
}

preg_match('/^string$/', $string);

    $matched = preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", "你好");

http://abc.com/index.php?p1=&&p2=hello&&p3=123

    public static function validateCustomAbc($value, $reason, $alias) {}