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

Posted

技术标签:

【中文标题】Laravel 价格验证只接受正数而不是 0【英文标题】:Laravel price validation only accept positive number and not only 0 【发布时间】:2018-08-19 02:49:19 【问题描述】:

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

价格只能包含不带 (.) 或 (,) 的数字,也不能以 0 开头。

例如

2500 //通过

02500 // 失败

12.12 // 失败

12,12 / 失败

我现在的规则是这样的:

'price' => 'required|integer|not_in:0',

上面的例子似乎可以工作,但我不明白。为什么integer 不允许像 0123 这样的开头为零。我只是想确保我的规则按预期工作并且我不会错过任何东西

谢谢

【问题讨论】:

【参考方案1】:

这对我有用:

'price' => 'required|numeric|gt:0',

【讨论】:

最干净的解决方案 这很干净,但如果你想接受 0 价格值怎么办 然后添加 gte:0。【参考方案2】:

您可以在将输入发送到 Request 类中的验证器之前对其进行格式化。

   public function formatInput()

  $input = array_map('trim', $this->all());

  $input['price'] = (int)($input['price']);
  $this->replace($input);
  return $this->all();

然后就可以使用了

'price' => 'required|integer|min:0',

希望对你有帮助

【讨论】:

自 v5.4 以来,laravel 是否开箱即用?我在想 \Illuminate\Foundation\Http\Middleware\TrimStrings::class, 中间件laravel-news.com/laravel-5-4-middleware @user2722667 这只是一个例子,你可以跳过这个【参考方案3】:

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

'price' => 'required|regex:^[1-9][0-9]+|not_in:0',

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

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

public function validateInteger($attribute, $value)

    return filter_var($value, FILTER_VALIDATE_INT) !== false;

因此,这种行为是 php 本身所关心的。 PHP 告诉我们有关 FILTER_VALIDATE_INT 的事情:

将值验证为整数,可选地从指定的范围,以及 成功时转换为 int。

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

【讨论】:

是的,我可以轻松使用正则表达式并将其添加到我的前端验证中,但我想了解为什么 laravel 规则 integer 不允许前导零 我使用相同但给我错误 preg_match(): No end delimiter '^' found @JagrutiMetaliya 写入单独的数组而不是管道【参考方案4】:

使用regex 规则不允许以 0 开头的整数

'price' => 'required|integer|not_in:0|regex:^[1-9][0-9]+',

【讨论】:

是的,我可以轻松使用正则表达式,但我想了解为什么 laravel 规则 integer 不允许前导零

以上是关于Laravel 价格验证只接受正数而不是 0的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法只接受字母而不是数字?如果给出数字,它应该显示验证错误,因为它只需要字母

Laravel 邮件:传递字符串而不是视图

LARAVEL 路线不接受

正数范围 18-65 的正则表达式是啥?它必须只接受两位数

Laravel 验证器抛出异常而不是重定向回来

Laravel Sanctum 返回 404 而不是未经身份验证的 401