示例:
Validator::make(['x' => ''], ['x' => 'nullable|integer|min:1'])->errors()->all();
输出:
[]
当x
为空或1,2,3等时,它可以正常工作。
当x
除了空字符串验证器之外的其他内容时,会说错误。
数据库中的列可以是NULL或正整数,所以当我传递空字符串时,验证器告诉我它很好,但是mysql会抛出异常,因为它试图将''
(空字符串)保存在可空整数列。
只有字段允许的值为:null
,1,2,3,4,...
,其他所有内容都应失败。
如果我添加required
规则,那么验证器将失败null
值('可空|必需|整数|分钟:1')
答案 0 :(得分:0)
通过源代码阅读此功能(在Validator.php
)
protected function isValidatable($rule, $attribute, $value)
{
return $this->presentOrRuleIsImplicit($rule, $attribute, $value) &&
$this->passesOptionalCheck($attribute) &&
$this->isNotNullIfMarkedAsNullable($attribute, $value) &&
$this->hasNotFailedPreviousRuleIfPresenceRule($rule, $attribute);
}
protected function presentOrRuleIsImplicit($rule, $attribute, $value)
{
if (is_string($value) && trim($value) === '') {
return $this->isImplicit($rule);
}
return $this->validatePresent($attribute, $value) || $this->isImplicit($rule);
}
函数presentOrRuleIsImplicit
基本上表示如果值为''
,则仅在规则为"隐式" (基本上如果需要属性)。
在这种情况下,如果它是必需的并且可以为空,则验证将失败,因为''
与null不同。
Laravel 5.4有一个名为ConvertEmptyStringsToNull
的内置中间件,它基本上可以通过获取所有''
值并将它们转换为null来解决这种差异。
答案 1 :(得分:0)
Laravel 5.4带有一个全局中间件,默认情况下将所有空字符串转换为null。如果您不想要这个,那么请从列表中注释掉中间件。
应用程序/ HTTP / Kernel.php
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,