我很难理解sometimes和nullable之间的区别。
每次我问别人只是让我去文档,听起来他们也不知道其中的区别。我已经多次阅读文档,但我不明白这是如何工作的
你能给我一个极简的验证器样本,其中有时更改为空值会改变验证的效果?
如果你想要一个最小的例子,它是:
$validator = Validator::make([
'a' => null
], [
'a' => 'sometimes|integer'
]);
dump($validator->passes()); // false
$validator = Validator::make([
'a' => null
], [
'a' => 'nullable|integer'
]);
dump($validator->passes()); // true
一些注意:有一个中间件包含在你的Kernel.php
默认称为ConvertEmptyStringsToNull
,当注释掉将使数据从表单作为空基本上被视为缺失而不是null。
sometimes|integer
在此特殊情况下与integer
在功能上相同,因为a
可以缺失,或者如果不缺失则为整数。
一般来说,sometimes
就像一个"守卫",如果字段存在,则在守卫的右侧应用验证规则,但如果字段不存在,则不执行任何操作。否则,如果没有sometimes
,则验证规则总是运行,但是当缺少字段时,所有验证规则(required*
规则除外)都通过。
假设您的请求包含:{name: 'value'}
我相信:
sometimes
表示name
字段可以在请求体中存在或不存在。意味着即使请求 上没有nullable
表示该字段必须存在,但该字段的值可以为null
。但是在这种情况下,您必须提供name
字段,即使是null值。
name
字段,它也会通过验证假设您有一个具有特定输入的表单,该表单仅根据先前的输入值显示。因此,该字段并不总是可用的:您可以使用sometimes
作为其"正常"用户不会总是提交这个字段。另一方面,如果字段总是显示但不是必需的:您将允许null
值,但不允许字段在正文中丢失的事实:因为它可能是一个bot或其他任何改变您的表单的东西:不正确。
有。当你有一个可空的验证规则时,这意味着与它相关联的字段在发送时可以有一个空值,使其成为可选的,但它将始终被验证。
'test_field1' => 'nullable|integer'
另一方面,有时验证规则仅在该字段通过请求发送时才应用与该字段关联的所有其他验证规则。例如:
'test_field1' => 'sometimes|integer'
这意味着只有当请求数据中有该字段时,test_field1才会被验证。
您可以在官方laravel文档中阅读更多关于验证规则的信息:https://laravel.com/docs/8.x/validation#conditionally-adding-rules https://laravel.com/docs/8.x/validation#rule-nullable