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

说明

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

function ($value) {
    return $newValue;
}

有许多的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);

输出

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即可