Laravel:验证大于零的数字失败

时间:2018-09-19 03:47:59

标签: php laravel validation laravel-validation

我必须验证价格字段,该字段必须大于零(0.01是有效的),所以我需要进行以下验证:

$request->validate([
            'product_price' => 'required|numeric|gt:0',
        ]);

问题是,当我在“ product_price”字段中输入字符串时,出现错误:

  

InvalidArgumentException被比较的值必须是   相同类型

那是为什么?我的意思是,我正在检查它应该是数字,甚至是在检查它是否大于0之前。

5 个答案:

答案 0 :(得分:10)

在Laravel 5.6和更高版本中添加了

gtgteltlte,我想这肯定是导致您出错的原因。 (尽管它对我有用。)

我认为您可以尝试这样

$request->validate([
    'product_price' => 'required|numeric|min:0|not_in:0',
]);

min:0确保最小值为0,并且不允许使用负值。 not_in:0确保值不能为0。因此,这两个规则的组合就可以完成工作。

您可以为某些规则定义有意义的错误消息。 (您也可以使用正则表达式获得相同的结果。)

答案 1 :(得分:1)

您可以尝试这种方式,

在调用Validator :: make()函数之前,通过附加要比较的值来修改规则集,如下所示:

use Illuminate\Support\Facades\Validator;

Validator::extend('greater_than', function ($attribute, $value, $otherValue) {
      return intval($value) > intval($otherValue[0]);
});

$validation = Validator::make($input, ['amount' => 'required|numeric|greater_than:0']);

答案 2 :(得分:1)

我看到没有其他答案能够真正解决您遇到此错误的真正原因,我将尝试提供一些见解和解决方案。

这里的问题是Laravel正在测试所有验证规则,并且在第一个验证错误(在您的情况下为numeric(由于提供的值是字符串而失败)的情况下没有停止,如果这样做是错误的在提供gt验证程序的情况下,不会抛出字符串值,因为在numeric错误之后验证程序已经退出。

要让Laravel在第一个失败的验证规则之后停止验证检查,可以在验证规则前面加上bail验证器,该验证器基本上告诉Laravel在第一个错误之后停止。

结果代码如下:

$request->validate([
    'product_price' => 'bail|required|numeric|gt:0',
]);

请注意,此解决方案还可以确保每个字段仅返回一个错误,如果您在用户界面中通常一次显示一次特定字段的所有错误(而不是仅从消息中选择第一个错误)袋),这种解决方案将改变这一点。

有关bail验证规则的更多信息,可以在这里找到:https://laravel.com/docs/6.x/validation#rule-bail

答案 3 :(得分:1)

对我来说,这段代码在我的项目中工作,

use Validator;

 $rules = [
            'product_price' => 'required|gt:0',
        ];

$validator = Validator::make($request->all(), $rules);


if ($validator->fails()) {
  return response()->json(array('status' => false, 'msg' => $validator->errors()->first()));
            exit;
        }

答案 4 :(得分:0)

对于我来说,这段代码正在我的项目中运行。

$validation_rules = array( 
                'user_id' => 'required|integer|gt:0',
                'type_id' => 'required|integer|gt:0',
            );
$validation = Validator::make($request->all(), $validation_rules);

在这里,gt:0检查整数是否大于零。

希望,这对您有用。如果没有,请检查您的Laravel版本。