验证器熟悉后,建议配合@Param
或@Validate
注解使用,代码应用域会清晰很多。
SW-X的验证器,依赖\x\Validate
组件,从v2.5.6.
版本起支持。
Validate
组件使用事件机制,支持开发者自定义除了框架以外的验证规则。
同时,Validate
验证器还支持场景创建,路由注解使用。
下面为\x\Validate
组件所支持的各种方法。
Validate
对一个字段,使用多个验证规则,是使用|
英文状态下的竖线符号进行分隔。
执行顺序,是从左往右依次执行。
例如,同时使用require
、int
、phone
三个规则:
[
'user_phone' => 'require|int|phone'
]
Validate
的内置规则,有些是需要传递参数才能正常使用,
例如min
、max
规则,都需要传递一个参数。
Validate
规则的参数使用格式为:
规则:参数1,参数2,...参数N
注意:必须是英文状态下的:
冒号。
示例:
[
'money' => 'min:10|max:100',
]
Validate
对多层字段,是使用.
英文状态下的逗号进行分隔。
例如param
数据为:
[
'list' => [
0 => [
'nick' => 'SW-X 框架'
],
]
]
规则就可以这样声明字段:
[
'list.0.nick' => 'max:100'
]
对应的message
,可以这样写:
[
'list.0.nick.max' => '不通过的说明'
]
Validate
的占位符,是对message
使用的,用于对错误提示语的字符替换使用。
占位符的使用方式比较复杂,共有3大场景:
假设,现在有一条规则:
$Validate->field('name')->alias('用户名')->rule('require')->message(['require' => '不能为空');
当验证失败时,就会记录error msg
:不能为空
。
但在实际开发中,这并不是正常业务想要的,如果想把alias
植入到message
里,就需要用到占位符。
例如,需要记录error msg
:用户名不能为空
。
可以使用{:preset}
,这是框架内置的占位符,用于代替字段名替换。
还可以使用{字段名}
,这跟{:preset}
的作用一致。
$Validate->field('name')->alias('用户名')->rule('require')->message(['require' => '{:preset}不能为空');
$Validate->field('name')->alias('用户名')->rule('require')->message(['require' => '{name}不能为空');
如果是多层字段的也需要注意:
$Validate->field('list.0.nick')->alias('用户名')->rule('require')->message(['require' => '{list.0.nick}不能为空');
对应字段名的替换,SW-X推荐使用{:preset}
占位符。
验证规则中,有些规则是不需要额外参数,而有些规则则需要传递参数,例如min
、max
等内置规则,就是单参数规则:
$Validate->field('name')->alias('用户名')->rule('max:100')->message(['max' => '{:preset}字符不能大于100');
按上面的代码,虽然验证失败时,会记录error msg
:用户名字符不能大于100
。
当如果之后修改max
对应的参数,就要连着修改message
的内容,这明显也不是正常业务想要的。
如果想把100
插入到message
的内容里,可以使用{规则名称}
的占位符。
还可以使用{0}
的占位符,两种方式的作用一致。
例如:
$Validate->field('name')->alias('用户名')->rule('max:100')->message(['max' => '{:preset}字符不能大于{max}');
$Validate->field('name')->alias('用户名')->rule('max:100')->message(['max' => '{:preset}字符不能大于{0}');
例如between
、username
等内置规则,就是多参数规则:
$Validate->field('age')->alias('年龄')->rule('between:1,100')->message(['max' => '{:preset}只允许在 1-100 之间');
按上面的代码,虽然验证失败时,会记录error msg
:年龄只允许在 1-100 之间
。
如果想把1,100
分别,插入到message
的内容里,可以按参数顺序,使用{0-N}
的占位符进行替换。
例如:
$Validate->field('age')->alias('年龄')->rule('between:1,100')->message(['max' => '{:preset}只允许在 {0}-{1} 之间');
作用:是否全部字段验证完成后,再返回验证结果。
依赖类:\x\Validate
方法名:batch()
返回值:this
参数:
bool $batch
false
示例
$Validate = new \x\Validate();
$Validate->batch(true);
作用:指定需要验证的字段信息,常用于单个字段验证,或者配合场景验证器使用。
依赖类:\x\Validate
方法名:field()
返回值:this
参数:
string|array $field
[]
示例
$Validate = new \x\Validate();
$Validate->field('name');
// 也可以多个字段
$Validate->field(['name', 'age']);
作用:验证字段失败后的字段别名,常用于配合单个字段验证。
依赖类:\x\Validate
方法名:alias()
返回值:this
参数:
string|array $alias
[]
示例
$Validate = new \x\Validate();
$Validate->field('name')->alias('用户名');
// 也可以多个字段
$Validate->field(['name', 'age'])->alias([
'name' => '用户名',
'age' => '年龄'
]);
作用:设置字段验证的使用规则,常用于配合单个字段验证。
依赖类:\x\Validate
方法名:rule()
返回值:this
参数:
string|array $rule
[]
示例
$Validate = new \x\Validate();
$Validate->field('name')->alias('用户名')->rule('require|max:25');
// 也可以多个字段
$Validate->field(['name', 'age']);
$Validate->alias([
'name' => '用户名',
'age' => '年龄'
]);
$Validate->rule([
'name' => 'require|max:25',
'age' => 'require|between:1,100'
]);
作用:设置字段验证失败后的返回说明,常用于配合单个字段验证。
依赖类:\x\Validate
方法名:message()
返回值:this
参数:
array $message
[]
示例
$Validate = new \x\Validate();
$Validate->field('name')->alias('用户名')->rule('require|max:25')->message(['require' => '{:preset}不能为空', 'max' => '{name}最多不能超过{max}个字符']);
// 也可以多个字段
$Validate->field(['name', 'age']);
$Validate->alias([
'name' => '用户名',
'age' => '年龄'
]);
$Validate->rule([
'name' => 'require|max:25',
'age' => 'require|between:1,100'
]);
$Validate->message([
'name.require' => '{:preset}不能为空',
'name.max' => '{name}最多不能超过{max}个字符',
'age.between' => '{:preset}只允许在 {0}-{1} 之间',
]);
SW-X内置的每一个验证规则,都有默认的message
值,如果使用时没有指定对应的message
,框架将会使用默认的message
。
作用:设置需要验证的数据集。
依赖类:\x\Validate
方法名:data()
返回值:this
参数:
array $data
[]
示例
$Validate = new \x\Validate();
$Validate->field(['name', 'age']);
$Validate->alias([
'name' => '用户名',
'age' => '年龄'
]);
$Validate->rule([
'name' => 'require|max:25',
'age' => 'require|between:1,100'
]);
$Validate->message([
'name.require' => '{:preset}不能为空',
'name.max' => '{name}最多不能超过{max}个字符',
'age.between' => '{:preset}只允许在 {0}-{1} 之间',
]);
$Validate->data([
'name' => 'SW-X',
'age' => 120,
]);
作用:选择使用的场景值,配合场景验证器使用。
依赖类:\x\Validate
方法名:scene()
返回值:this
参数:
string $scene
null
示例
$Validate = new \x\Validate();
// 这个edit是需要开发者自己创建验证器才能使用的
$Validate->scene('edit');
作用:移除验证的某些字段,配合场景验证器使用。
依赖类:\x\Validate
方法名:filter()
返回值:this
参数:
string $filter
null
示例
$Validate = new \x\Validate();
// 这个edit是需要开发者自己创建验证器才能使用的
$Validate->scene('edit');
$Validate->field(['id', 'name', 'age']);
$Validate->filter('id, age');
作用:执行验证,并且是否不通过验证。
依赖类:\x\Validate
方法名:fails()
返回值:true
不通过验证,false
通过验证
参数:
string $data
data()
方法,传入验证数据。[]
示例
$Validate = new \x\Validate();
$Validate->field(['name', 'age']);
$Validate->alias([
'name' => '用户名',
'age' => '年龄'
]);
$Validate->rule([
'name' => 'require|max:25',
'age' => 'require|between:1,100'
]);
$Validate->message([
'name.require' => '{:preset}不能为空',
'name.max' => '{name}最多不能超过{max}个字符',
'age.between' => '{:preset}只允许在 {0}-{1} 之间',
]);
$data = [
'name' => 'SW-X',
'age' => 120,
];
if ($Validate->fails($data)) {
echo '验证不通过';
}
作用:获得验证失败后的message
集合。
依赖类:\x\Validate
方法名:errors()
返回值:array
参数:无
示例:
$Validate = new \x\Validate();
$Validate->field(['name', 'age']);
$Validate->alias([
'name' => '用户名',
'age' => '年龄'
]);
$Validate->rule([
'name' => 'require|max:25',
'age' => 'require|between:1,100'
]);
$Validate->message([
'name.require' => '{:preset}不能为空',
'name.max' => '{name}最多不能超过{max}个字符',
'age.between' => '{:preset}只允许在 {0}-{1} 之间',
]);
$data = [
'name' => 'SW-X',
'age' => 120,
];
if ($Validate->fails($data)) {
// 打印失败原因
var_dump($Validate->errors());
}
返回值结构(二维数组):
[
[
"intact_field" => "list.0.nick", // 原来的字段名
"field" => "nick", // 末尾的字段名
"rule" => "max", // 失败的规则名称
"message" => "昵称的字符长度不能大于100", // 最终替换占位符后的message值
]
]