为空值分配默认值,在验证之前执行,当值为空数组,空字符以及null时判断为空。

请注意

默认值不支持数组元素,也就是说:为id.*这种设定默认值是不支持的

# 使用

# 类属性定义

使用类的$default参数来为字段设定默认值








 
 
 
 










class Setting extends Validate
{
    protected $rule = [
        'site_status'     => 'required|in:0,1',
        'register_status' => 'required|in:0,1'
    ];

    protected $default = [
        'site_status'     => 1,
        'register_status' => 1
    ];
}

$data = Setting::make()->check([]);
print_r($data);
//Array
//(
//    [site_status]     => 1
//    [register_status] => 1
//)

# 在验证场景中使用

在类中增加一个base验证场景

class Setting extends Validate
{
    protected $rule = [
        'site_status'     => 'required|in:0,1',
        'register_status' => 'required|in:0,1'
    ];

    protected $default = [
        'site_status'     => 1,
        'register_status' => 1
    ];

    protected function sceneBase(ValidateScene $scene)
    {
        $scene->only(['site_status'])
            ->default('site_status', 0);
    }
}
$data = Setting::make()->scene('base')->check([]);
print_r($data);
//Array
//(
//    [site_status] => 1
//)

说明

一个字段只能拥有一个默认值,验证场景中的默认值生效后,全局定义的默认值就失效。

默认值只对当前需要验证的字段生效

# 多样的默认值

# 闭包

默认值支持闭包,闭包将收到三个值

  • $value 当前的值
  • $attribute 当前的字段名
  • $originalData 当前正在进行验证的全部原始数据
  • $dataAttribute 数据属性

回调方法的样式如下:

function($value, string $attribute, array $originalData, DataAttribute $dataAttribute) {
    return $value;
}

示例:

$scene->defalt('name', function($value) {
    return '张三';
});

删除字段

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

# 类方法

使用类方法为指定字段传递默认值时,同样会接受到三个值

  • $value 当前的值
  • $attribute 当前的字段名
  • $originalData 当前正在进行验证的全部原始数据
  • $dataAttribute 数据属性
$scene->defalt('name', [$this,'setDefaultName']);

public function setDefaultName($value, string $attribute, array $originalData)
{
    return '张三';
}

简易方法:

定义一个默认值方法,(方法的命名规范是default+ 首字母大写的名称)

$scene->defalt('name','setDefaultName');

public function defaultSetDefaultName($value, string $attribute, array $originalData)
{
    return '张三';
}

删除字段

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

# 忽略空条件

当值为空数组,空字符以及null时,才会取出对应默认值并赋值到原数据上, 如果你想任何值都获取一次默认值,可以增加any => true的条件,如果增加了any,你需要将你的默认值放入value中,如下:

class Setting extends Validate
{
    protected $rule = [
        'site_status' => 'required|in:0,1',
    ];

    protected $default = [
        'site_status' => ['value' => 1, 'any' => true],
    ];
}

这个时候,无论site_status的原始参数是什么,都会被重置为1,你也可以使用该特性,为参数做提前格式化等操作

# 取消默认值

如果你想在验证场景中,取消类属性中设定的默认值,可以将值设定为null,如下:

class User extends Validate
{
    protected $rule = [
        'name' => ''
    ];

    protected $default = [
        'name' => '张三'
    ];

    protected function sceneTest(ValidateScene $scene)
    {
        $scene->only(['name'])
            ->default('name', null);
    }
}

$data = User::make()->scene('test')->check([]); // 返回空数组

# 提供默认值的类

创建一个提供默认值的类,需要实现W7\Validate\Support\Concerns\DefaultInterface接口:

class DefaultUserId implements DefaultInterface
{
    public function handle($value, string $attribute, array $originalData)
    {
        return $_SESSION['user_id'];
    }
}

使用:

class UserValidate extends Validate
{
    protected $rule = [
        'id'   => 'required',
    ];

    protected $default = [
        'id' => DefaultUserId::class
    ];
}

删除字段

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