同步操作将从 inhere/php-validate 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
一个简洁小巧且功能完善的php验证库。仅有几个文件,无依赖。
规则设置参考自 yii 的。部分规则参考自 laravel
编辑 composer.json
,在 require
添加
"inhere/php-validate": "dev-master",
然后执行: composer update
git clone https://git.oschina.net/inhere/php-validate.git // git@osc
git clone https://github.com/inhere/php-validate.git // github
创建一个新的class,并继承 inhere\validate\Validation
。用于一个(或一系列相关)请求的验证, 相当于 laravel 的 表单请求验证
此方式是最为完整的使用方式
use inhere\validate\Validation;
class PageRequest extends Validation
{
public function rules()
{
return [
['tagId,title,userId,freeTime', 'required', 'msg' => '{attr} is required!'],
['tagId', 'size', 'min'=>4, 'max'=>567], // 4<= tagId <=567
['title', 'min', 40],
['freeTime', 'number'],
['tagId', 'number', 'when' => function($data) {
return isset($data['status']) && $data['status'] > 2;
}],
['userId', 'number', 'on' => 'scene1' ],
['username', 'string', 'on' => 'scene2' ],
['title', 'customValidator', 'msg' => '{attr} error msg!' ],
['status', function($status) {
if ($status > 3) {
return true;
}
return false;
}],
['created_at, updated_at', 'safe'],
];
}
// 添加一个验证器。必须返回一个布尔值标明验证失败或成功
protected function customValidator($title)
{
// some logic ...
return true; // Or false;
}
// 定义字段翻译
public function attrTrans()
{
return [
'userId' => '用户Id',
];
}
// 自定义验证器的提示消息, 更多请看 {@see ValidationTrait::_defaultMessages}
public function messages()
{
return [
'required' => '{attr} 是必填项。',
];
}
}
使用
// 验证 POST 数据
$valid = PageRequest::make($_POST)->validate();
// 验证失败
if ($valid->fail()) {
var_dump($valid->getErrors());
var_dump($valid->firstError());
}
// 验证成功 ...
$safeData = $valid->getSafeData(); // 验证通过的安全数据
// $postData = $valid->all(); // 原始数据
$db->save($safeData);
需要快速简便的使用验证时,可直接使用 inhere\validate\Validation
use inhere\validate\Validation;
class SomeController
{
public function demoAction()
{
$valid = Validation::make($_POST,[
// add rule
['title', 'min', 40],
['freeTime', 'number'],
])->validate();
if ($valid->fail()) {
var_dump($valid->getErrors());
var_dump($valid->firstError());
}
// $postData = $valid->all(); // 原始数据
$safeData = $valid->getSafeData(); // 验证通过的安全数据
$db->save($safeData);
}
}
创建一个新的class,并使用 Trait inhere\validate\ValidationTrait
。 此方式是高级自定义的使用方式, 可以方便的嵌入到其他类中
如下, 嵌入到一个数据模型类中,添加数据库记录前自动进行验证
class DataModel
{
use \inhere\validate\ValidationTrait;
protected $data = [];
protected $db;
/**
* @param array $data
* @return $this
*/
public function setData($data)
{
$this->data = $data;
return $this;
}
public function create()
{
if ($this->validate()->fail()) {
return false;
}
return $this->db->insert($this->getSafeData());
}
}
使用:
class UserModel extends DataModel
{
public function rules()
{
return [
['username, passwd', 'required', 'on' => 'create' ],
['passwd', 'compare', 'repasswd', 'on' => 'create']
['username', 'string', 'min' => 2, 'max' => 20, 'on' => 'create' ],
['id', 'number', 'on' => 'update' ],
['created_at, updated_at', 'safe'],
];
}
}
// ...
class UserController
{
// in action
// @api /user/add
public function addAction()
{
$model = new UserModel;
$ret = $model->setData($_POST)->atScene('create')->create();
if (!$ret) {
exit($model->firstError());
}
echo "add success: userId = $ret";
}
}
inhere\validate\Validation
的子类添加验证方法. 请看上面的 使用方式1
Validation::addValidator()
添加自定义验证器. e.g:
$valid = Validation::make($_POST,[
// add rule
['title', 'min', 40],
['freeTime', 'number'],
['title', 'checkTitle'],
])
->addValidator('checkTitle',function($title){
// some logic ...
return true; // 成功返回 True。 如果验证失败,返回 False.
}, '{attr} default message!')
->validate();
['status', function($status) {
if ($status > 3) {
return true;
}
return false;
}]
on
-- 设置规则使用场景如果需要让定义的规则在多个类似情形下重复使用,可以设置规则的使用场景。在验证时也表明要验证的场景
// 在继承了 Validation 的子类 ValidationClass 中 ...
public function rules()
{
return [
['title', 'required' ],
['userId', 'number', 'on' => 'create' ],
['userId', 'int', 'on' => 'update' ],
['name', 'string', 'on' => 'create,update' ],
];
}
使用:
如,在下面指定了验证场景时,将会使用上面的第 1,3,4 条规则. (第 1 条没有限制规则使用场景的,在所有场景都可用)
// ...
$valid = ValidationClass::make($_POST)->atScene('update')->validate();
// ...
when
-- 规则的前置条件只有在先满足了(
when
)前置条件时才会验证这条规则
如在下面的例子中,检查到第二条规则时,会先执行闭包(when
),
当其返回 true
验证此条规则,否则不会验证此条规则
// 在继承了 Validation 的子类中 ...
public function rules()
{
return [
['title', 'required' ],
['tagId', 'number', 'when' => function($data)
{
return isset($data['status']) && $data['status'] > 2;
}],
];
}
skipOnEmpty
-- 为空是否跳过验证当字段值为空时是否跳过验证,默认值是 true
. (参考自 yii2)
'required*' 规则不在此限制内.
如,有一条规则:
['name', 'string']
提交的数据中 没有 name
字段或者 $data['name']
等于空都不会进行 string
验证;
只有当 $data['name']
有值且不为空时才会验证是否是string
如果要想为空时也检查, 请将此字段同时加入 required
规则中.
['name', 'required' ]
['name', 'string' ]
或者也可以设置 'skipOnEmpty' => false
:
['name', 'string', 'skipOnEmpty' => false ]
isEmpty
-- 是否为空判断是否为空判断, 这个判断作为 skipOnEmpty
的依据. 默认使用 ValidatorList::isEmpty
来判断.
你也可以自定义判断规则:
['name', 'string', 'isEmpty' => function($value) {
return true or false;
}]
safe
-- 标记属性/字段是安全的标记属性/字段是安全的,无需验证,直接加入到安全数据中。
比如我们在写入数据库之前手动追加的字段: 创建时间,更新时间。
['created_at, updated_at', 'safe']
public function setScene(string $scene)
public function atScene(string $scene) // setScene 的别名方法
设置当前验证的场景名称。将只会使用符合当前场景的规则对数据进行验证
public function validate(array $onlyChecked = [], $stopOnError = null)
进行数据验证。 返回验证器对象,然后就可以获取验证结果等信息。
$onlyChecked
可以设置此次需要验证的字段$stopOnError
是否当出现一个验证失败就立即停止。 默认是 true
public function addValidator(string $name, \Closure $callback, string $msg = '')
添加自定义的验证器。 返回验证器对象以支持链式调用
$name
自定义验证器名称$callback
自定义验证器。处理验证,为了简洁只允许闭包。$msg
可选的。 当前验证器的错误消息public function hasError()
public function isFail() // hasError() 的别名方法
public function fail() // hasError() 的别名方法
获取验证是否通过(是否有验证失败)。
public function getErrors(): array
获取所有的错误信息, 包含所有错误的字段和错误信息的多维数组。 eg:
[
[ attr1 => 'error message 1'],
[ attr1 => 'error message 2'],
[ attr2 => 'error message 3'],
]
同一个属性/字段也可能有多个错误消息,当为它添加了多个验证规则时。
public function firstError($onlyMsg = true)
$onlyMsg
是否只返回消息字符串。当为 false,返回的则是数组 eg: [ attr => 'error message']
public function lastError($onlyMsg = true)
$onlyMsg
是否只返回消息字符串。当为 false,返回的则是数组 eg: [ attr => 'error message']
public function getSafeData(): array
获取所有 验证通过 的安全数据.
注意: 当有验证失败出现时,安全数据
safeData
将会被重置为空。 即只有全部通过验证,才能获取到safeData
public function getSafe(string $key, $default = null)
public function getValid(string $key, $default = null) // getSafe() 的别名方法
从 验证通过 的数据中取出对应 key 的值
public function all(): array
获取验证时传入的所有数据
public function get(string $key, $default = null)
从验证时传入的数据中取出对应 key 的值
验证器 | 说明 | 规则示例 |
---|---|---|
int |
验证是否是 int | ['userId', 'int'] |
number/num |
验证是否是 number | ['userId', 'number'] |
bool |
验证是否是 bool | ['open', 'bool'] |
float |
验证是否是 float | ['price', 'float'] |
string |
验证是否是 string. 支持长度检查 |
['name', 'string'] , ['name', 'string', 'min'=>4, 'max'=>16]
|
alpha |
验证值是否仅包含字母字符 | ['name', 'alpha'] |
alphaNum |
验证是否仅包含字母、数字 | ['field', 'alphaNum'] |
alphaDash |
验证是否仅包含字母、数字、破折号( - )以及下划线( _ ) | ['field', 'alphaDash'] |
isArray |
验证是否是数组 | ['goods', 'isArray'] |
required |
要求此字段/属性是必须的 | ['tagId, userId', 'required' ] |
requiredIf |
指定的其它字段( anotherField )值等于任何一个 value 时,此字段为 必填 | ['city', 'requiredIf', 'myCity', ['chengdu'] ] |
requiredUnless |
指定的其它字段( anotherField )值等于任何一个 value 时,此字段为 不必填 | ['city', 'requiredUnless', 'myCity', ['chengdu'] ] |
requiredWith |
指定的字段中的 任意一个 有值且不为空,则此字段为 必填 | ['city', 'requiredWith', ['myCity'] ] |
requiredWithAll |
如果指定的 所有字段 都有值,则此字段为 必填 | ['city', 'requiredWithAll', ['myCity', 'myCity1'] ] |
requiredWithout |
如果缺少 任意一个 指定的字段值,则此字段为 必填 | ['city', 'requiredWithout', ['myCity', 'myCity1'] ] |
requiredWithoutAll |
如果所有指定的字段 都没有 值,则此字段为 必填 | ['city', 'requiredWithoutAll', ['myCity', 'myCity1'] ] |
json |
验证是否是json字符串 | ['goods', 'json'] |
url |
验证是否是 url | ['myUrl', 'url'] |
email |
验证是否是 email | ['userEmail', 'email'] |
date |
验证是否是 date | ['published_at', 'date'] |
dateFormat |
验证是否是 date, 并且是指定的格式 | ['published_at', 'dateFormat', 'Y-m-d'] |
ip |
验证是否是 IP | ['ipAddr', 'ip'] |
ipv4 |
验证是否是 IPv4 | ['ipAddr', 'ipv4'] |
ipv6 |
验证是否是 IPv6 | ['ipAddr', 'ipv6'] |
size |
验证大小范围, 可以支持验证 int , string , array 数据类型 |
['tagId', 'size', 'min'=>4, 'max'=>567] |
range |
size 验证的别名 |
跟 size 一样 |
length |
长度验证( 跟 size 差不多, 但只能验证 string , array 的长度 |
.... |
min |
最小边界值验证 | ['title', 'min', 40] |
max |
最大边界值验证 | ['title', 'max', 40] |
in |
枚举验证 | ['status', 'in', [1,2,3] |
notIn |
枚举验证 | ['status', 'notIn', [1,2,3] |
compare/same |
字段值比较 | ['passwd', 'compare', 'repasswd'] |
regexp |
使用正则进行验证 | ['name', 'regexp', '/^\w+$/'] |
int
是比较大小。 string
和 array
是检查长度required*
系列规则参考自 laravel可运行示例请看 example
MIT
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。