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

Posted

技术标签:

【中文标题】Laravel:验证大于零的数字失败【英文标题】:Laravel: Validating a number greater than zero is failing 【发布时间】:2019-02-23 03:33:46 【问题描述】:

我要验证一个需要大于零的价格字段(0.01 有效),所以我有以下验证:

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

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

InvalidArgumentException 比较的值必须是 同类型

这是为什么呢?我的意思是,我在检查它是否应该是数字之前,甚至检查它是否 > 0

【问题讨论】:

gt 规则是:gt:field,在你的事业中你给了 0。laravel.com/docs/5.7/validation#rule-gt 【参考方案1】:

gtgteltlte 在 Laravel 5.6 及更高版本中添加,我猜这一定是你得到错误的原因。 (不过它对我有用。)

我觉得你可以这样试试

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

min:0 确保最小值为 0,并且不允许出现负值。 not_in:0 确保值不能为 0。因此,这两个规则的组合就可以了。

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

【讨论】:

还没有尝试过,但我相信它对我不起作用,因为问题清楚地表明 0.1 是一个有效值,并且您的答案将初始值限制为 >=1 0.1 就是一个例子。再一次,它必须大于零,但不需要将其起点缩小到初始值,因为 0.1、0.01、0.001 ... 都是有效值 这条规则允许所有大于0小于10000的数字。包括0.1、0.001等十进制数。这是你想要的吗? 对不起,我的错误,没有正确阅读答案。一个问题,你的答案允许零吗?因为不应该。不好意思问一下,是不是我回家后才能测试它 它就像魅力一样!只得测试一下。从我在网上看到的所有解决方案中,您的解决方案是最直接和最干净的。谢谢你【参考方案2】:

我可以看到其他答案都没有解决您收到此错误的真正原因,我会尝试提供一些见解和解决方案。

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

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

生成的代码如下所示:

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

请注意,此解决方案还使得每个字段只返回一个错误,如果在您的 UI 中您通常一次显示特定字段的所有错误(而不是只从消息中选择第一个错误袋),这个解决方案将改变这一点。

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

【讨论】:

【参考方案3】:

你可以试试这个方法,

在调用 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']);

【讨论】:

【参考方案4】:

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

$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 版本。

【讨论】:

【参考方案5】:

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

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;
        

【讨论】:

以上是关于Laravel:验证大于零的数字失败的主要内容,如果未能解决你的问题,请参考以下文章

laravel+阿里大于实现发送验证码短信

laravel验证外键个数不大于另一个表的id

如果验证失败/成功,Laravel 会更改响应标头

Laravel 身份验证 hasValidCredentials 失败

Laravel 验证:检查验证器失败的原因

Laravel 5 更改表单请求失败的验证行为