为空值分配默认值,在验证之前执行,当值为空数组,空字符以及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] => 0
//)
说明
一个字段只能拥有一个默认值,验证场景中的默认值生效后,全局定义的默认值就失效。
默认值只对当前需要验证的字段生效
多种定义方法
除了直接写一个值作为默认值以外,默认值还支持以下几种方式来定义
闭包
默认值支持闭包,闭包将收到四个值
$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
即可
提供默认值的类
创建一个提供默认值的类,需要实现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
即可
忽略空条件
当值为空数组,空字符以及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([]); // 返回空数组