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

MrC*_*ujo 2 php validation laravel laravel-validation

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

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

问题是,当我在'product_price'字段中输入一个字符串时,我收到一个错误:

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

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

Tha*_*cky 20

gt,gte,ltlte在Laravel 5.6及以后的版本中加入,我猜一定是原因,你的错误.(虽然这对我有用.)

我想你可以这样试试

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

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

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


eff*_*ffy 6

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

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

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

结果代码如下所示:

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

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

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