在验证后给输入值应用一个过滤器, 并在验证后把它赋值回原属性变量。
说明
过滤器可以为全局函数名,匿名函数,过滤器类或其他,该函数的样式必须是:
function ($value) {
return $newValue;
}
有许多的PHP方法结构和filter
需要的结构一致。 比如使用类型转换方法 (intval
, boolval
, ...) 来确保属性为指定的类型, 你可以简单的设置这些方法名而不是重新定义一个匿名函数
使用
类属性定义
class UserValidate extends Validate
{
protected $rule = [
'id' => 'required|array',
'id.*' => 'numeric'
];
protected $filter = [
'id.*' => 'intval'
];
}
$data = UserValidate::make()->check([
'id' => ['1', 2]
]);
var_dump($data);
输出
array(1) {
'id' =>
array(4) {
[0] =>
int(1)
[1] =>
int(2)
}
}
在验证场景中使用
class UserValidate extends Validate
{
protected $rule = [
'id' => 'required|array',
'id.*' => 'numeric'
];
protected function sceneToInt(ValidateScene $scene)
{
$scene->only(['id', 'id.*'])
->filter('id.*', 'intval');
}
}
$data = UserValidate::make()->scene('toInt')->check([
'id' => ['1', 2]
]);
var_dump($data);
输出
array(1) {
'id' =>
array(2) {
[0] =>
int(1)
[1] =>
int(2)
}
}
多种定义方法
过滤器处理直接使用PHP内置方法以外,还支持以下几种方式定义
闭包
过滤器也支持闭包,闭包将收到两个值
$value
当前的值 $dataAttribute
数据属性
回调方法的样式如下:
function($value, DataAttribute $dataAttribute) {
return $newValue;
}
示例:
$scene->filter('name', function ($value, DataAttribute $dataAttribute) {
return removeXss($value);
});
过滤器类
创建一个过滤器类,需要实现W7\Validate\Support\Concerns\FilterInterface
接口:
class UniqueFilter implements FilterInterface
{
public function handle($value)
{
return array_unique($value);
}
}
class UserValidate extends Validate
{
protected $rule = [
'id' => 'required|array',
'id.*' => 'numeric'
];
protected $filter = [
'id' => UniqueFilter::class
];
}
$data = UserValidate::make()->scene('toInt')->check([
'id' => [1,2,1,2,3,3,4]
]);
var_dump($data);
输出
array(1) {
'id' =>
array(4) {
[0] =>
int(1)
[1] =>
int(2)
[4] =>
int(3)
[6] =>
int(4)
}
}
删除字段
如果想删除字段,在构造方法中,验证器会传入DataAttribute
对象,可以将该对象的deleteField
属性设为true
即可
类方法
过滤器也支持直接写入类方法的方式,(方法的命名规范是filter
+ 首字母大写的名称)
class UserValidate extends Validate
{
protected $rule = [
'id' => 'required|array',
'id.*' => 'numeric'
];
protected $filter = [
'id' => 'uniqueFilter'
];
public function filterUniqueFilter($value)
{
return array_unique($value);
}
}
在验证场景中可以直接使用[$this,'filterUniqueFilter']
来传递callable
删除字段
如果想删除字段,验证器会在方法的第二个字段传入DataAttribute
对象,可以将该对象的deleteField
属性设为true
即可