在验证后给输入值应用一个过滤器, 并在验证后把它赋值回原属性变量。

说明

过滤器可以为全局函数名,匿名函数,过滤器类或其他,该函数的样式必须是:

function ($value) {
    return $newValue;
}
1
2
3

有许多的PHP方法结构和filter需要的结构一致。 比如使用类型转换方法 (intvalboolval, ...) 来确保属性为指定的类型, 你可以简单的设置这些方法名而不是重新定义一个匿名函数

使用

类属性定义

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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

输出

array(1) {
  'id' =>
  array(4) {
    [0] =>
    int(1)
    [1] =>
    int(2)
  }
}
1
2
3
4
5
6
7
8
9

在验证场景中使用

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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

输出

array(1) {
  'id' =>
  array(2) {
    [0] =>
    int(1)
    [1] =>
    int(2)
  }
}
1
2
3
4
5
6
7
8
9

过滤器类

创建一个过滤器类,需要实现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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

输出

array(1) {
  'id' =>
  array(4) {
    [0] =>
    int(1)
    [1] =>
    int(2)
    [4] =>
    int(3)
    [6] =>
    int(4)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

删除字段

如果想删除字段,在构造方法中,验证器会传入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);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

在验证场景中可以直接使用[$this,'filterUniqueFilter']来传递callable

删除字段

如果想删除字段,验证器会在方法的第二个字段传入DataAttribute对象,可以将该对象的deleteField属性设为true即可

Last Updated: 2021/10/13 下午2:39:38