Laravel价格验证仅接受正数,而不仅仅是0

use*_*667 5 validation laravel

我想验证Laravel中的“价格”字段。

价格应仅包含不带(。)或(,)的数字,并且也不能以0开头。

例如

2500 //通过

02500 //失败

12.12 //失败

12,12 /失败

我现在的规则如下所示:

'price' => 'required|integer|not_in:0',
Run Code Online (Sandbox Code Playgroud)

它似乎与上面的示例一起工作,但是我不理解。为什么integer不允许像0123这样的内容以零开头。我只想确保自己的规则符合预期,并且我不会错过任何东西

谢谢

Nik*_*kov 17

这对我有用:

'price' => 'required|numeric|gt:0',
Run Code Online (Sandbox Code Playgroud)

  • 然后添加 gte:0。 (2认同)

kev*_*iel 7

如果您不确定规则“整数”,您可以使用正则表达式验证如下:

'price' => 'required|regex:^[1-9][0-9]+|not_in:0',
Run Code Online (Sandbox Code Playgroud)

我遇到了和你一样的问题,从那以后我总是使用正则表达式验证来满足这种要求。此外,如果您想使用 js 进行前端验证,它允许您收回相同的正则表达式。

这是允许验证整数的 laravel 函数:

public function validateInteger($attribute, $value)
{
    return filter_var($value, FILTER_VALIDATE_INT) !== false;
}
Run Code Online (Sandbox Code Playgroud)

因此,这种行为是由 PHP 本身引起的。PHP 告诉我们关于 FILTER_VALIDATE_INT 的事情:

将 value 验证为 integer,可选地来自指定的范围,并在成功时转换为 int。

PHP 没有设置有关“0”值的其他信息,但众所周知,此函数不考虑以“0”开头的数字。


Adn*_*taz 6

您可以先格式化输入,然后再将其发送到Request班级中的验证器。

   public function formatInput()
{
  $input = array_map('trim', $this->all());

  $input['price'] = (int)($input['price']);
  $this->replace($input);
  return $this->all();
}
Run Code Online (Sandbox Code Playgroud)

那你可以用

'price' => 'required|integer|min:0',
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助