Laravel的验证器传递空字符串,并且可以使用' nullable'规则

时间:2017-05-18 08:34:32

标签: laravel laravel-validation

示例:

Validator::make(['x' => ''], ['x' => 'nullable|integer|min:1'])->errors()->all();

输出:

[]

x为空或1,2,3等时,它可以正常工作。

x除了空字符串验证器之外的其他内容时,会说错误。

数据库中的列可以是NULL或正整数,所以当我传递空字符串时,验证器告诉我它很好,但是mysql会抛出异常,因为它试图将''(空字符串)保存在可空整数列。

只有字段允许的值为:null1,2,3,4,...,其他所有内容都应失败。

如果我添加required规则,那么验证器将失败null值('可空|必需|整数|分钟:1')

2 个答案:

答案 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,