PHPackages                             webgeeker/validation - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. webgeeker/validation

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

webgeeker/validation
====================

Validation for WebGeeker

0.5.3(5y ago)6136.6k—0%19[1 issues](https://github.com/photondragon/webgeeker-validation/issues)2MITPHPPHP &gt;=5.6CI failing

Since Apr 8Pushed 5y ago3 watchersCompare

[ Source](https://github.com/photondragon/webgeeker-validation)[ Packagist](https://packagist.org/packages/webgeeker/validation)[ RSS](/packages/webgeeker-validation/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (1)Versions (23)Used By (2)

WebGeeker-Validation: 一个强大的 PHP 参数验证器
=====================================

[](#webgeeker-validation-一个强大的-php-参数验证器)

用于对API接口的请求参数进行合法性检查。

在实现服务端的API接口时，对于每一个接口的每一个参数，都应该检测其取值是否合法，以免错误的数据输入到系统中。这个工作可以说是费时费力，但又不得不做。而且PHP本身是弱类型语言，不但要验证取值，还要验证数据的类型是否符合，这就更复杂了。

本工具就是针对这个工作而设计的，能够有效地减少编码量，代码可读性好。

看看下面这段代码，可以对用法有个大概印象，应该不难看懂：

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

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

支持多种数据类型的校验：整型、浮点型、bool型、字符串、数组、对象、文件、日期时间，能够验证嵌套的数据结构中的参数，还支持带条件判断的验证。

- 目录
    - [1 简介](#1-%E7%AE%80%E4%BB%8B)
        - [1.1 为什么要写这样一个工具?](#11-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%86%99%E8%BF%99%E6%A0%B7%E4%B8%80%E4%B8%AA%E5%B7%A5%E5%85%B7)
        - [1.2 特点](#12-%E7%89%B9%E7%82%B9)
        - [1.3 一个简单示例](#13-%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B)
    - [2 安装](#2-%E5%AE%89%E8%A3%85)
    - [3 快速上手](#3-%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B)
        - [3.1 一个完整的示例（不使用任何框架）](#31-%E4%B8%80%E4%B8%AA%E5%AE%8C%E6%95%B4%E7%9A%84%E7%A4%BA%E4%BE%8B%E4%B8%8D%E4%BD%BF%E7%94%A8%E4%BB%BB%E4%BD%95%E6%A1%86%E6%9E%B6)
        - [3.2 验证不通过的错误处理](#32-%E9%AA%8C%E8%AF%81%E4%B8%8D%E9%80%9A%E8%BF%87%E7%9A%84%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86)
        - [3.3 在第三方框架中的用法](#33-%E5%9C%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E6%A1%86%E6%9E%B6%E4%B8%AD%E7%9A%84%E7%94%A8%E6%B3%95)
    - [4 详细使用方法](#4-%E8%AF%A6%E7%BB%86%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)
        - [4.1 验证整型参数](#41-%E9%AA%8C%E8%AF%81%E6%95%B4%E5%9E%8B%E5%8F%82%E6%95%B0)
        - [4.2 验证浮点型参数](#42-%E9%AA%8C%E8%AF%81%E6%B5%AE%E7%82%B9%E5%9E%8B%E5%8F%82%E6%95%B0)
        - [4.3 验证bool型参数](#43-%E9%AA%8C%E8%AF%81bool%E5%9E%8B%E5%8F%82%E6%95%B0)
        - [4.4 验证字符串型参数](#44-%E9%AA%8C%E8%AF%81%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%9E%8B%E5%8F%82%E6%95%B0)
        - [4.5 验证数组型、对象型、文件型、日期时间型参数](#45-%E9%AA%8C%E8%AF%81%E6%95%B0%E7%BB%84%E5%9E%8B%E5%AF%B9%E8%B1%A1%E5%9E%8B%E6%96%87%E4%BB%B6%E5%9E%8B%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E5%9E%8B%E5%8F%82%E6%95%B0)
        - [4.6 验证器串联（与）](#46-%E9%AA%8C%E8%AF%81%E5%99%A8%E4%B8%B2%E8%81%94%E4%B8%8E)
        - [4.7 Required 验证器](#47-required-%E9%AA%8C%E8%AF%81%E5%99%A8)
        - [4.8 忽略所有 Required 验证器](#48-%E5%BF%BD%E7%95%A5%E6%89%80%E6%9C%89-required-%E9%AA%8C%E8%AF%81%E5%99%A8)
        - [4.9 嵌套参数的验证](#49-%E5%B5%8C%E5%A5%97%E5%8F%82%E6%95%B0%E7%9A%84%E9%AA%8C%E8%AF%81)
        - [4.10 条件判断型验证器](#410-%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD%E5%9E%8B%E9%AA%8C%E8%AF%81%E5%99%A8)
        - [4.11 验证规则并联（或）](#411-%E9%AA%8C%E8%AF%81%E8%A7%84%E5%88%99%E5%B9%B6%E8%81%94%E6%88%96)
        - [4.12 关于特殊值`null`, `""`，`0`，`false`的问题](#412-%E5%85%B3%E4%BA%8E%E7%89%B9%E6%AE%8A%E5%80%BCnull-0false%E7%9A%84%E9%97%AE%E9%A2%98)
        - [4.13 关于基本数据类型与字符串的关系](#413-%E5%85%B3%E4%BA%8E%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%85%B3%E7%B3%BB)
        - [4.14 自定义错误信息输出文本](#414-%E8%87%AA%E5%AE%9A%E4%B9%89%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E8%BE%93%E5%87%BA%E6%96%87%E6%9C%AC)
        - [4.15 国际化](#415-%E5%9B%BD%E9%99%85%E5%8C%96)
        - [4.16 国际化（0.4版之前）](#416-%E5%9B%BD%E9%99%85%E5%8C%9604%E7%89%88%E4%B9%8B%E5%89%8D)
        - [4.17 自定义验证器](#417-%E8%87%AA%E5%AE%9A%E4%B9%89%E9%AA%8C%E8%AF%81%E5%99%A8)
    - [A 附录 - 验证器列表](#a-%E9%99%84%E5%BD%95---%E9%AA%8C%E8%AF%81%E5%99%A8%E5%88%97%E8%A1%A8)
        - [A.1 整型](#a1-%E6%95%B4%E5%9E%8B)
        - [A.2 浮点型](#a2-%E6%B5%AE%E7%82%B9%E5%9E%8B)
        - [A.3 bool型](#a3-bool%E5%9E%8B)
        - [A.4 字符串型](#a4-%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%9E%8B)
        - [A.5 数组型](#a5-%E6%95%B0%E7%BB%84%E5%9E%8B)
        - [A.6 对象型](#a6-%E5%AF%B9%E8%B1%A1%E5%9E%8B)
        - [A.7 文件型](#a7-%E6%96%87%E4%BB%B6%E5%9E%8B)
        - [A.8 日期和时间型](#a8-%E6%97%A5%E6%9C%9F%E5%92%8C%E6%97%B6%E9%97%B4%E5%9E%8B)
        - [A.9 条件判断型](#a9-%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD%E5%9E%8B)
        - [A.10 其它验证器](#a10-%E5%85%B6%E5%AE%83%E9%AA%8C%E8%AF%81%E5%99%A8)

1 简介
----

[](#1-简介)

### 1.1 为什么要写这样一个工具?

[](#11-为什么要写这样一个工具)

我在使用Laravel框架的时候，Laravel提供了一个参数验证工具，不过用起来不怎么顺畅：

- 每一个验证都写一个验证类（继承XXX），这样太麻烦，而且系统中会多出许多许多的类；如果这些类在多处被复用，或者为了“更加”复用（减少重复代码），再在这些类之间搞出很多的继承关系，那么这些类的维护本身就是一个大问题；
- 验证器有“一词多义”的问题。比如它有一个`size`验证器，它同时支持验证字符串、整型、文件等多种类型的参数，针对不同数据类型`size`的含义不一样。这就好比你去背英语单词，有那么一些英语单词，它有很多很多意思，不同的语境下有不同的含义。比如"present"这个单词，它既有“呈现”、“出席”的意思，也有“礼物”的意思。这种一词多义的单词最让人头疼了，搞不清它到底什么意思，而且记不住啊。

为了解决这些问题，所以才写了这么一个工具。

### 1.2 特点

[](#12-特点)

1. 每个功能特性都有单元测试（共有 44 tests, 700+ assertions）
2. 支持无限嵌套的数据结构的验证（参考 1.3 节的例子）
3. 支持条件验证，根据参数取值不同，应用不同的验证规则（参考 1.3 节的例子）
4. 支持正则表达式验证
5. 简洁，验证逻辑一目了然
6. 轻量，不需要定义和维护各种验证classes
7. 验证器语义明确，没有“一词多义”的问题
8. 易学易记。比如整型验证器都是以"Int"开头，浮点型验证器都是以"Float"开头，等等。唯一不符合这一规则的是字符串型验证器，它们一部分以"Str"开头的，但也有一部分不以"Str"开头，比如`Regexp`, `Ip`, `Email`, `Url`等。
9. 不绑定任何一个框架，无任何依赖。你可以在任何一个框架中使用这个工具，就算你不使用框架，也可以使用本工具。
10. 支持**自定义验证器**，可以实现各种自定义验证功能

### 1.3 一个简单示例

[](#13-一个简单示例)

下面这个示例展示了一个查询获取用户投诉列表的Request参数的验证（注意其中的*条件验证*和针对*嵌套数据结构的验证*）：

```
//验证规则
$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);
```

2 安装
----

[](#2-安装)

通过Composer安装

```
composer require webgeeker/validation:^0.5.2

```

3 快速上手
------

[](#3-快速上手)

### 3.1 一个完整的示例（不使用任何框架）

[](#31-一个完整的示例不使用任何框架)

这个例子直接验证`$_POST`（POST表单）中的参数，展示了最基本的用法

```
