我们最近将Laravel从5.5升级到5.6我有验证规则:
return [
'min_price' => ['numeric', 'nullable', 'min:0'],
'max_price' => ['numeric', 'nullable', 'min:0', 'gt:min_price'],
]
如果
- 最小价格=零,最大价格=100
- 最小价格=0,最大价格=99.99
- 最小价格=12.50,最大价格=100
- 最小价格=12.50,最大价格=空上面写着:
ERROR: The values under comparison must be of the same type "exception":"[object] (InvalidArgumentException(code: 0): The values under comparison must be of the same type at vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php:1659)
[stacktrace]
#0 vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(849): Illuminate\Validation\Validator->requireSameType(12.50, 100)
它说,两个字段应该具有相同的类型,所以它不能比较integer和float,也不能忽略可为null的字段。问题在于性状ValidatesAttributes
中的方法validateGt
、validateLt
、validateGte
、validateLte
。有没有一些方法可以扩展或覆盖这个特性?
由于没有明显的解决方案,我决定创建自己的验证器,不使用Laravel提供的验证器:
class ServiceProvider extends BaseServiceProvider
{
public function boot()
{
ValidatorFacade::extend('greater_than', Validator::class.'@validateGreaterThan');
ValidatorFacade::replacer('greater_than', function ($message, $a, $b, $parameters) {
$attributes = trans('validation.attributes');
$other = $parameters[0];
$other = isset($attributes[$other]) ? $attributes[$other] : $other;
return str_replace(':field', $other, $message);
});
}
public function register()
{
}
}
并将其用于像这样的验证规则
return [
'min_price' => ['numeric', 'nullable', 'min:0'],
'max_price' => ['numeric', 'nullable', 'min:0', 'greater_than:min_price'],
]