Laravel的验证器使用“nullable”规则传递空字符串

Laravel的验证器使用“nullable”规则传递空字符串,laravel,laravel-validation,Laravel,Laravel Validation,例如: Validator::make(['x' => ''], ['x' => 'nullable|integer|min:1'])->errors()->all(); 输出: [] 当x为null或1,2,3等时,它工作正常 当x是除空字符串之外的其他内容时,验证器会说明错误 数据库中的列可以是NULL或正整数,所以当我传递空字符串时,验证器告诉我这很好,但mysql抛出异常,因为它试图将空字符串保存在可为NULL的整数列中 字段的唯一允许值为:null,1,2,

例如:

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

[]
当x为null或1,2,3等时,它工作正常

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

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

字段的唯一允许值为:null,1,2,3,4,…,其他所有值都应失败


如果我添加了必需的规则,那么验证器将因空值'nullable | required | integer | min:1'而失败。

读取源代码validator.php中有此函数

函数presentOrRuleIsImplicit基本上表示,如果值为,则仅当规则基本上是隐式的(如果属性是必需的)时才对其进行验证

在这种情况下,如果它是必需的且可为null,则验证将失败,因为它与null不同


Laravel 5.4有一个名为ConvertEmptyStringsToull的内置中间件,它通过获取所有值并将其转换为null来帮助处理这种差异

Laravel 5.4附带了一个全局中间件,可以在默认情况下将所有空字符串转换为null。如果您不希望这样,请从列表中注释掉中间件

app/Http/Kernel.php

\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
规则nullable只说明,该值可以为null,但它不会将空值转换为null本身。该值不是null,因此nullable在这里并不真正有效。如果您使用Validator::make['x'=>],则['x'=>'integer | min:1']->错误->全部;你仍然没有错误
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,