【发布时间】:2021-10-24 15:19:06
【问题描述】:
我很难理解有时和可为空之间的区别。
每次我要求人们只是将我发送到文档时,听起来他们也不知道其中的区别。我已经多次阅读文档,但我不明白它是如何工作的
你能否给我一个简单的验证器样本,其中包含有时更改为可为空会改变验证效果的数据?
【问题讨论】:
标签: php laravel validation
我很难理解有时和可为空之间的区别。
每次我要求人们只是将我发送到文档时,听起来他们也不知道其中的区别。我已经多次阅读文档,但我不明白它是如何工作的
你能否给我一个简单的验证器样本,其中包含有时更改为可为空会改变验证效果的数据?
【问题讨论】:
标签: php laravel validation
如果你想要一个最小的例子,那就是:
$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* 规则除外)都会通过。
【讨论】:
a 输入时,两个验证器都返回 true。
required* 验证规则在字段缺失时失败,所有其他规则都通过
是的,有。当您拥有可为空的验证规则时,这意味着与其关联的字段在发送时可以具有空值,使其成为可选但始终会被验证。
'test_field1' => 'nullable|integer'
另一方面,有时验证规则仅在通过请求发送该字段时应用与该字段关联的所有其他验证规则。例如:
'test_field1' => 'sometimes|integer'
这意味着只有当请求数据具有该字段时,如果 test_field1 是一个整数,它将被双向验证。
您可以在 laravel 官方文档中阅读更多关于验证规则的信息:https://laravel.com/docs/8.x/validation#conditionally-adding-ruleshttps://laravel.com/docs/8.x/validation#rule-nullable
【讨论】:
假设您的请求包含:{name: 'value'}
我相信:
sometimes 表示name 字段可以存在或不存在于请求正文中。意味着即使请求中没有 name 字段,它也会通过验证nullable 表示该字段必须存在,但字段值可以是null。但在这种情况下,即使是空值,您也必须提供 name 字段。假设您有一个特定输入的表单,该输入仅根据之前的输入值显示。所以这个字段并不总是可用的:你可以使用sometimes 作为它的“正常”,用户不会总是提交这个字段。
另一方面,如果该字段始终显示但不是必需的:您将允许 null 值,但不允许该字段在正文中丢失的事实:因为它可能是机器人或其他任何改变您的表单的东西: 不正确。
【讨论】:
nullable 字段也不能出现在输入中,除非它们也是 required。区别在于nullable 允许字段不存在或存在时为空,sometimes 允许字段不存在但不允许字段存在时为空
nullable 倾向于与其他规则结合使用。它本身没有多大意义