Laravel空值验证规则不起作用

5

我最近升级到了laravel 5.4(从5.2),以使用nullable验证规则。

我有一个字段act_post_code,它可以是一个integernull。因此,在我的Request类中提供了以下规则。

'act_post_code' => 'integer|nullable'

在 Postman 中使用 form-data,我提供了一个键为 act_post_code,值为null
我得到的响应如下:
{
    "act_post_code": [
        "The act post code must be an integer."
    ]
}

1
在规则列表中,使用可空类型来定义整数。 - user320487
2
@btl 没有起作用。同样的回应。 - Parampal Pooni
1
你的表定义中 act_post_code 是否可为空? - user320487
1
如果您只使用可空类型会发生什么? - meda
@meda 如果它接受 null ... 嗯,那可能是 postman 解释 null 的方式,被视为字符串了? - Parampal Pooni
显示剩余5条评论
5个回答

7

解释:

很不幸,似乎nullable只对某些其他验证条件有效。

例如:'act_post_code' => 'nullable|integer'会给你返回错误:"validation.integer"

然而,'act_post_code' => 'nullable|date'就能正常工作。

修复方法:

为了解决这些验证问题,您可以使它们变得动态。例如,在验证器之前:

$act_post_code_rules = $request->act_post_code ? 'integer' : '';

然后,在验证中:

'act_post_code' => $act_post_code_rules


我在 Laravel 8.8 中看到了这种描述的行为 - 只有像 nullable 和 integer 这样特定的组合不起作用。在我看来,这是一个 bug。 - Alex P.

2

可以通过放弃请求参数并检查实际值是否为空或为"null"(字符串形式)来使其失效。有时在通过JavaScript提交表单时,我们使用FormData()将数据附加到表单中,在这些情况下,它可能会发送一个空值,即字符串类型的"null"。

array:5 [
  "firstName" => "Kaustubh"
  "middleName" => "null" // null as string
  "lastName" => "Bagwe"
  "contactNumber" => null // null value
  "photo" => null
  "_method" => "PUT"
]

2
为了验证字段act_post_code,它可以是整数类型或可为空的。您可以尝试以下方法:
  • 在迁移中声明表的模式,其中包含列act_post_code,请像这样声明列:$table->integer('act_post_code')->nullable();
  • 您可以尝试使用以下代码进行验证:'act_post_code' =>'sometimes|nullable|integer'

请查看:Laravel文档这个,并搜索nullable和sometimes! - sajed zarrinpour
Laravel 8.8的第二个选项无法工作。 - Alex P.

1
打开您的迁移文件,并将此字段设置为可为空。
例如:
Schema::create('your_table_name', function (Blueprint $table) {
    $table->integer('act_post_code ')->nullable();    
});

请确保在您的模型文件中,它存在于可填充部分。

protected $fillable = ['act_post_code'];

1
经过一些测试,我发现可空规则只在我们传递的数据确实是空数据时才起作用。
因此,在我的测试用例中,我使用以下验证规则:
"counter" => "nullable|numeric"
在 blade 文件中,我使用 Form::text('counter','') 作为输入数据的元素。
然后,我进行了几个测试:
  1. 当我输入非数字值的 counter 数据时,它会响应错误:
    "the counter must be a number"
  2. 当我输入数字值的 counter 数据时,它将通过验证测试。
  3. 当我没有输入任何数据到 counter 时,它将通过验证测试。
所以,我手动检查数据使用 dd($request_data) 或者如果您使用 ajax 就使用 return $request_data 并使用 console.log("data") 打印出来,如下所示:
$.ajax({
type:'POST',
data:{_token:"{{ csrf_token() }}",
    counter:$('input[name="counter"]').val()
},success:function(data){
  console.log(data);   
 }
});

我发现当输入字段被清空时,它将会给出null值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接