-
Notifications
You must be signed in to change notification settings - Fork 33
config rule
Inhere edited this page Mar 24, 2019
·
3 revisions
一个完整的规则示例, 包含了所有可添加的项。
注意:
- 每条规则的第一个元素必须是 要验证的字段(可以同时配置多个,可以是数组. type:
string|array
) - 第二个元素必须是一个验证器(字符串,闭包,可回调的对象或数组. type:
string|Closure|callable
) - 后面紧跟着 是验证器可能需要的参数信息 (若验证器需要的参数只有一个,则参数无需带key)
- 然后就是其他选项配置(
msg
,on
,filter
, ...)
// a full rule
[
// basic validate setting
'field0,field1,...', 'validator', 'arg0', 'arg1', ...,
// some extended option settings
'skipOnEmpty' => 'bool',
'msg' => 'string|array',
'default' => 'mixed',
'on' => 'string|array'
'isEmpty' => 'callback(string|closure)',
'when' => 'callback(string|closure)',
'filter' => 'callback(string|array|closure)'
]
字段验证器
FieldValidation
的配置类似,只是 只有一个字段,而验证器允许有多个
除了可以添加字段的验证之外,还有一些特殊关键词可以设置使用,以适应各种需求。
给一个或多个字段设置一个默认值。
['page', 'number', 'default' => 1],
['pageSize', 'number', 'default' => 15],
NOTICE: 默认值也会被验证器验证
设置当前规则的错误提示消息, 设置了后就不会在使用默认的提示消息。
['title', 'customValidator', 'msg' => '{attr} error msg!' ], // 指定当前规则的消息
// o, 可以是数组哦 :)
['tagId,title,userId,freeTime', 'required', 'msg' => [
'tagId' => 'message ...',
'userId' => 'message 1 ...',
]],
如果需要让定义的规则在多个类似情形下重复使用,可以设置规则的使用场景。在验证时也表明要验证的场景
// 在继承了 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
),
当其返回 true
验证此条规则,否则不会验证此条规则
// 在继承了 Validation 的子类中 ...
public function rules()
{
return [
['title', 'required' ],
['tagId', 'number', 'when' => function($data) {
return isset($data['status']) && $data['status'] > 2;
}],
];
}
当字段值为空时是否跳过验证,默认值是 true
. (参考自 yii2)
'required*' 规则不在此限制内.
如,有一条规则:
['name', 'string']
提交的数据中 没有 name
字段或者 $data['name']
等于空都不会进行 string
验证;
只有当 $data['name']
有值且不为空 时才会验证是否是 string
如果要想为空时也检查, 请将此字段同时加入 required
规则中.
['name', 'required' ]
['name', 'string' ]
或者也可以设置 'skipOnEmpty' => false
:
['name', 'string', 'skipOnEmpty' => false ]
如何确定值为空 关于为空
是否为空判断, 这个判断作为 skipOnEmpty
的依据. 默认使用 Validators::isEmpty
来判断.
你也可以自定义判断规则:
['name', 'string', 'isEmpty' => function($value) {
return true or false;
}]
支持在进行验证前对值使用过滤器进行净化过滤内置过滤器
['tagId,userId,freeTime', 'number', 'filter' => 'int'],
['field', 'validator', 'filter' => 'filter0|filter1...'],
// 需要自定义性更高时,可以使用数组。
['field1', 'validator', 'filter' => [
'string',
'trim',
['Class', 'method'],
['Object', 'method'],
// 追加额外参数。 传入时,第一个参数总是要过滤的字段值,其余的依次追加
'myFilter' => ['arg1', 'arg2'],
// 直接使用闭包
function($val) {
return str_replace(' ', '', $val);
},
]],
提示:
- 允许同时使用多个过滤器。字符串使用
|
分隔,或者配置为数组。 - 注意: 写在当前类里的过滤器方法必须带有后缀
Filter
, 以防止对内部的其他的方法造成干扰 - 通过类
Filtration
,可以独立使用过滤器功能 - php内置过滤器请参看 http://php.net/manual/zh/filter.filters.sanitize.php
我的其他项目
- inhere/console 一个功能全面的php命令行应用库
- inhere/sroute 轻量且快速的HTTP请求路由库