【问题标题】:Laravel 5.4 - Correct Validation rule for a required parameter that can be zeroLaravel 5.4 - 可以为零的必需参数的正确验证规则
【发布时间】:2018-04-01 09:14:26
【问题描述】:

我正在尝试验证将库存加载到表中的请求。到目前为止,股票始终具有正值,并且以下验证规则完全符合预期:

[
    "value" => "required|integer|min:0"
]

库存已存储并且可以有多个值,现在库存的value 为零 (0),我认为它不适用于“必需”规则。

我已将其更改为使用“present”,我认为应该足够了,但它仍然失败,并且添加“nullable”也不起作用:

[
    "value" => "present|integer|min:0"
]

是否有验证规则指定字段必须存在但值可以为零?

【问题讨论】:

  • 您尝试过正则表达式验证吗?类似regex:[0-9]+

标签: php validation laravel-5.4


【解决方案1】:

您的初始验证规则会继续按预期工作; required 不会在 0 上抛出错误:

[
    "value" => "required|integer|min:0"
]

来自Laravel documentation

验证中的字段必须存在于输入数据中,而不是 空的。如果出现以下情况之一,则该字段被视为“空” 条件为真:

  • 值为空。
  • 该值为空字符串。
  • 该值为空数组或空 Countable 对象。
  • 该值为上传的文件,没有路径。

【讨论】:

  • 当字段为必填或存在且值为 0(零)时,验证器肯定会失败并从数据数组中删除该值。
  • 那我恐怕肯定有别的事情发生了。验证器确实是这样工作的。
  • 嗨@Propaganistas 我找到了解决方案并于昨天发布。不过感谢您的帮助。
【解决方案2】:

所以问题实际上在于我使用 $request->intersect(...),因为它将值为零 (0) 的键视为 false,因此将它们从请求数据数组中删除。

对于可能遇到此问题的其他任何人,以下是将零 (0) 值视为真实值的解决方案; null 值、空字符串和 false 将被视为 false。

NB$params$rules$messagesarrays。请参阅https://laravel.com/docs/5.4/validation#manually-creating-validators 了解更多信息。

return \Validator::make(array_filter($request->only($params), function($param) {
    // This is needed to strip out empty values but treat zero (0) as truthy (default array_filter behaviour is
    // to treat zero (0) as false) but we want these values to be present in the validated request data array as
    // zero (0) in the context of a denomination is valid now that we will hold unactivated stock in the Vault.
    return ($param !== null && $param !== false && $param !== '');
}), $rules, $messages);

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2017-10-13
    • 2020-07-09
    • 2019-11-11
    • 2018-04-24
    • 2023-04-02
    • 2017-06-21
    • 2017-07-08
    相关资源
    最近更新 更多