Skip to content

Commit

Permalink
merge master feature to php5 branch
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Dec 26, 2017
1 parent ceed770 commit 6840409
Show file tree
Hide file tree
Showing 18 changed files with 836 additions and 313 deletions.
41 changes: 24 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
- 支持基本的数组检查,数组的子级值检查
- 方便的获取错误信息,验证后的安全数据获取
- 已经内置了40多个常用的验证器[内置验证器](#built-in-validators)
- 规则设置参考自 yii 的。部分规则参考自 laravel
- 规则设置参考 yii. 部分规则参考自 laravel, Respect/Validation
- 新增了独立的过滤器 `Inhere\Validate\Filter\Filtration` 用于数据过滤

支持两种规则配置方式:
Expand Down Expand Up @@ -56,9 +56,9 @@ e.g

- 使用 composer 命令

```bash
composer require inhere/php-validate
// composer require inhere/php-validate ^version // 指定版本
```php
composer require inhere/php-validate
// composer require inhere/php-validate ^2.2
```

- 使用 composer.json
Expand Down Expand Up @@ -97,14 +97,14 @@ class PageRequest extends Validation
{
return [
['tagId,title,userId,freeTime', 'required'],
['tagId', 'size', 'min'=>4, 'max'=>567], // 4<= tagId <=567
['title', 'min', 40],
['tagId', 'size', 'min'=>4, 'max'=>567, 'filter' => 'int'], // 4<= tagId <=567
['title', 'min', 40, 'filter' => 'trim'],
['freeTime', 'number'],
['tagId', 'number', 'when' => function($data) {
return isset($data['status']) && $data['status'] > 2;
}],
['userId', 'number', 'on' => 'scene1' ],
['username', 'string', 'on' => 'scene2' ],
['userId', 'number', 'on' => 'scene1', 'filter' => 'int'],
['username', 'string', 'on' => 'scene2', 'filter' => 'trim'],
['username', 'regexp' ,'/^[a-z]\w{2,12}$/'],
['title', 'customValidator', 'msg' => '{attr} error msg!' ], // 指定当前规则的消息
['status', function($status) { // 直接使用闭包验证
Expand Down Expand Up @@ -376,8 +376,7 @@ $v = Validation::make($_POST,[
{
return [
['title', 'required' ],
['tagId', 'number', 'when' => function($data)
{
['tagId', 'number', 'when' => function($data) {
return isset($data['status']) && $data['status'] > 2;
}],
];
Expand Down Expand Up @@ -514,6 +513,7 @@ public function isFail() // hasError() 的别名方法
public function fail() // hasError() 的别名方法
// 成功通过验证
public function ok()
public function passed()
public function isPassed() // passed() 的别名方法
```
Expand Down Expand Up @@ -597,17 +597,19 @@ public function get(string $key, $default = null)

过滤器 | 说明 | 示例
-------|-------------|------------
`int/integer` | 过滤非法字符并转换为`int`类型 | `['userId', 'number', 'filter' => 'int'],`
`abs` | 返回绝对值 | `['field', 'int', 'filter' => 'abs'],`
`int/integer` | 过滤非法字符并转换为`int`类型 **支持数组** | `['userId', 'number', 'filter' => 'int'],`
`float` | 过滤非法字符,保留`float`格式的数据 | `['price', 'float', 'filter' => 'float'],`
`string` | 过滤非法字符并转换为`string`类型 | `['userId', 'number', 'filter' => 'string'],`
`trim` | 去除首尾空白字符,支持数组。 | `['username', 'min', 4, 'filter' => 'trim'],`
`nl2br` | 转换 `\n` `\r\n` `\r``<br/>` | `['content', 'string', 'filter' => 'nl2br'],`
`lower/lowercase` | 字符串转换为小写 | `['description', 'string', 'filter' => 'lowercase'],`
`upper/uppercase` | 字符串转换为大写 | `['title', 'string', 'filter' => 'uppercase'],`
`snake/snakeCase` | 字符串转换为蛇形风格 | `['title', 'string', 'filter' => 'snakeCase'],`
`camel/camelCase` | 字符串转换为驼峰风格 | `['title', 'string', 'filter' => 'camelCase'],`
`timestamp/strToTime` | 字符串日期转换时间戳 | `['pulishedAt', 'number', 'filter' => 'strToTime'],`
`abs` | 返回绝对值 | `['field', 'int', 'filter' => 'abs'],`
`url` | URL 过滤,移除所有不符合 URL 的字符 | `['field', 'url', 'filter' => 'url'],`
`str2list/str2array` | 字符串转数组 `'tag0,tag1' -> ['tag0', 'tag1']` | `['tags', 'strList', 'filter' => 'str2array'],`
`email` | email 过滤,移除所有不符合 email 的字符 | `['field', 'email', 'filter' => 'email'],`
`encoded` | 去除 URL 编码不需要的字符,与 `urlencode()` 函数很类似 | `['imgUrl', 'url', 'filter' => 'encoded'],`
`clearTags/stripTags` | 相当于使用 `strip_tags()` | `['content', 'string', 'filter' => 'clearTags'],`
Expand All @@ -623,11 +625,11 @@ public function get(string $key, $default = null)
验证器 | 说明 | 规则示例
----------|-------------|------------
`int/integer` | 验证是否是 int | `['userId', 'int']`
`num/number` | 验证是否是 number | `['userId', 'number']`
`int/integer` | 验证是否是 int **支持范围检查** | `['userId', 'int']` `['userId', 'int', 'min'=>4, 'max'=>16]`
`num/number` | 验证是否是 number **支持范围检查** | `['userId', 'number']` `['userId', 'number', 'min'=>4, 'max'=>16]`
`bool/boolean` | 验证是否是 bool | `['open', 'bool']`
`float` | 验证是否是 float | `['price', 'float']`
`string` | 验证是否是 string. 支持长度检查 | `['name', 'string']`, `['name', 'string', 'min'=>4, 'max'=>16]`
`string` | 验证是否是 string. **支持长度检查** | `['name', 'string']`, `['name', 'string', 'min'=>4, 'max'=>16]`
`url` | 验证是否是 url | `['myUrl', 'url']`
`email` | 验证是否是 email | `['userEmail', 'email']`
`alpha` | 验证值是否仅包含字母字符 | `['name', 'alpha']`
Expand All @@ -636,14 +638,18 @@ public function get(string $key, $default = null)
`isMap` | 验证值是否是一个非自然数组 map (key - value 形式的) | `['goods', 'isMap']`
`isList` | 验证值是否是一个自然数组 list (key是从0自然增长的) | `['tags', 'isList']`
`isArray` | 验证是否是数组 | `['goods', 'isArray']`
`hasKey` | 验证数组存在给定的key(s) | `['goods', 'hasKey', 'pear']` `['goods', 'hasKey', ['pear', 'banana']]`
`intList` | 验证字段值是否是一个 int list | `['tagIds', 'intList']`
`numList` | 验证字段值是否是一个 number list | `['tagIds', 'numList']`
`strList` | 验证字段值是否是一个 string list | `['tags', 'strList']`
`min` | 最小边界值验证 | `['title', 'min', 40]`
`max` | 最大边界值验证 | `['title', 'max', 40]`
`size/range/between` | 验证大小范围, 可以支持验证 `int`, `string`, `array` 数据类型 | `['tagId', 'size', 'min'=>4, 'max'=>567]`
`length` | 长度验证( 跟 `size`差不多, 但只能验证 `string`, `array` 的长度 | `['username', 'length', 'min' => 5, 'max' => 20]`
`in/enum` | 枚举验证 | `['status', 'in', [1,2,3]`
`fixedSize/fixedLength` | 固定的长度/大小 | `['field', 'fixedSize', 12]`
`startWith` | 值(`string/array`)是以给定的字符串开始 | `['field', 'startWith', 'hell']`
`endWith` | 值(`string/array`)是以给定的字符串结尾 | `['field', 'endWith', 'world']`
`in/enum` | 枚举验证 | `['status', 'in', [1,2,3]]`
`notIn` | 枚举验证 | `['status', 'notIn', [4,5,6]]`
`mustBe` | 必须是等于给定值 | `['status', 'mustBe', 1]`
`notBe` | 不能等于给定值 | `['status', 'notBe', 0]`
Expand All @@ -663,12 +669,13 @@ public function get(string $key, $default = null)
`beforeOrEqualDate` | 字段值必须是小于或等于给定日期的值 | `['publishedAt', 'beforeOrEqualDate', '2017-05-12']`
`afterOrEqualDate` | 字段值必须是大于或等于给定日期的值 | `['publishedAt', 'afterOrEqualDate', '2017-05-12']`
`afterDate` | 验证字段值必须是给定日期之前的值 | `['publishedAt', 'afterDate', '2017-05-12']`
`json` | 验证是否是json字符串 | `['goods', 'json']`
`json` | 验证是否是json字符串(默认严格验证,必须以`{` `[` 开始) | `['goods', 'json']` `['somedata', 'json', false]` - 非严格,普通字符串`eg 'test'`也会通过
`file` | 验证是否是上传的文件 | `['upFile', 'file']`
`image` | 验证是否是上传的图片文件 | `['avatar', 'image']`, 限定后缀名 `['avatar', 'image', 'jpg,png']`
`ip` | 验证是否是 IP | `['ipAddr', 'ip']`
`ipv4` | 验证是否是 IPv4 | `['ipAddr', 'ipv4']`
`ipv6` | 验证是否是 IPv6 | `['ipAddr', 'ipv6']`
`macAddress` | 验证是否是 mac Address | `['field', 'macAddress']`
`md5` | 验证是否是 md5 格式的字符串 | `['passwd', 'md5']`
`sha1` | 验证是否是 sha1 格式的字符串 | `['passwd', 'sha1']`
`color` | 验证是否是html color | `['backgroundColor', 'color']`
Expand Down
11 changes: 11 additions & 0 deletions examples/DataModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ class DataModel

protected $data = [];

protected $db;

/**
* @param array $data
* @return $this
Expand All @@ -21,4 +23,13 @@ public function setData($data)

return $this;
}

public function create()
{
if ($this->validate()->fail()) {
return false;
}

return $this->db->insert($this->getSafeData());
}
}
File renamed without changes.
36 changes: 30 additions & 6 deletions examples/filter.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,31 @@
<?php
/**
* Created by PhpStorm.
* User: inhere
* Date: 2017-11-24
* Time: 18:13
*/

require __DIR__ . '/simple-loader.php';

$data = [
'name' => ' tom ',
'status' => ' 23 ',
'word' => 'word',
'toLower' => 'WORD',
'title' => 'helloWorld',
];

$rules = [
['name', 'string|trim'],
['status', 'trim|int'],
['word', 'string|trim|upper'],
['toLower', 'lower'],
['title', [
'string',
'snake' => ['-'],
'ucfirst',
]],
];

echo "------------- raw data: -------------\n";
var_dump($data);

$cleaned = \Inhere\Validate\Filter\Filtration::make($data, $rules)->filtering();

echo "------------- cleaned data: -------------\n";
var_dump($cleaned);
60 changes: 60 additions & 0 deletions examples/help.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# help


```php

/**
* @link http://php.net/manual/zh/function.filter-input.php
* @param int $type INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV
* @param $varName
* @param array $filter 过滤/验证器 {@link http://php.net/manual/zh/filter.filters.php}
* @param array $options 一个选项的关联数组,或者按位区分的标示。
* 如果过滤器接受选项,可以通过数组的 "flags" 位去提供这些标示。
* 如果成功的话返回所请求的变量。
* 如果成功的话返回所请求的变量。
* 如果过滤失败则返回 FALSE ,
* 如果 varName 不存在的话则返回 NULL 。
* 如果标示 FILTER_NULL_ON_FAILURE 被使用了,那么当变量不存在时返回 FALSE ,当过滤失败时返回 NULL 。
*/
public static function input($type, $varName, $filter, array $options = [])
{
}

public static function multi(array $data, array $filters = [])
{
}

/**
* @link http://php.net/manual/zh/function.filter-input-array.php
* 检查(验证/过滤)输入数据中的多个变量名 like filter_input_array()
* 当需要获取很多变量却不想重复调用 filter_input()时很有用。
* @param int $type One of INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV. 要检查的输入数据
* @param mixed $definition 一个定义参数的数组。
* 一个有效的键必须是一个包含变量名的string,
* 一个有效的值要么是一个filter type,或者是一个array 指明了过滤器、标示和选项。
* 如果值是一个数组,那么它的有效的键可以是 :
* filter, 用于指明 filter type,
* flags 用于指明任何想要用于过滤器的标示,
* options 用于指明任何想要用于过滤器的选项。
* 参考下面的例子来更好的理解这段说明。
* @param bool $addEmpty 在返回值中添加 NULL 作为不存在的键。
* 如果成功的话返回一个所请求的变量的数组,
* 如果失败的话返回 FALSE 。
* 对于数组的值,
* 如果过滤失败则返回 FALSE ,
* 如果 variable_name 不存在的话则返回 NULL 。
* 如果标示 FILTER_NULL_ON_FAILURE 被使用了,那么当变量不存在时返回 FALSE ,当过滤失败时返回 NULL 。
*/
public static function inputMulti($type, $definition, $addEmpty = true)
{
}

/**
* 检查变量名是否存在
* @param int $type One of INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV. 要检查的输入数据
* @param string $varName Name of a variable to check. 要检查的变量名
*/
public static function inputHasVar($type, $varName)
{
}
```
33 changes: 29 additions & 4 deletions src/AbstractValidation.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,13 @@ abstract class AbstractValidation implements ValidationInterface
* @throws \InvalidArgumentException
* @throws \RuntimeException
*/
public function __construct(array $data = [], array $rules = [], array $translates = [], $scene = '', $startValidate = false)
{
public function __construct(
array $data = [],
array $rules = [],
array $translates = [],
$scene = '',
$startValidate = false
) {
$this->data = $data;
$this->setRules($rules)->setScene($scene)->setTranslates($translates);
if ($startValidate) {
Expand All @@ -59,8 +64,28 @@ public function __construct(array $data = [], array $rules = [], array $translat
* @throws \InvalidArgumentException
* @throws \RuntimeException
*/
public static function make(array $data, array $rules = [], array $translates = [], $scene = '', $startValidate = false)
{
public static function make(
array $data,
array $rules = [],
array $translates = [],
$scene = '',
$startValidate = false
) {
return new static($data, $rules, $translates, $scene, $startValidate);
}

/**
* 创建并且立即开始验证
* @param array $data
* @param array $rules
* @param array $translates
* @param string $scene
* @return static
* @throws \InvalidArgumentException
* @throws \RuntimeException
*/
public static function makeAndValidate(array $data, array $rules = [], array $translates = [], $scene = '')
{
return new static($data, $rules, $translates, $scene, true);
}
}
7 changes: 3 additions & 4 deletions src/FieldValidation.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

namespace Inhere\Validate;

use Inhere\Validate\Utils\Helper;

/**
* Class FieldValidation
* - one field to many rules. like Laravel framework
Expand Down Expand Up @@ -50,13 +52,12 @@ protected function collectRules()
if (!$scene) {
continue;
}
$sceneList = \is_string($rule['on']) ? array_map('trim', explode(',', $rule['on'])) : (array)$rule['on'];
$sceneList = \is_string($rule['on']) ? Helper::explode($rule['on']) : (array)$rule['on'];
if (!\in_array($scene, $sceneList, true)) {
continue;
}
unset($rule['on']);
}

$this->_usedRules[] = $rule;
$field = array_shift($rule);
if (\is_object($rule[0])) {
Expand All @@ -70,8 +71,6 @@ protected function collectRules()
}
}
}

yield [];
}

/**
Expand Down
Loading

0 comments on commit 6840409

Please sign in to comment.