Php 空字符串验证不需要的整数
我必须验证API的输入字段,其中的值必须是1到100之间的整数或Php 空字符串验证不需要的整数,php,laravel,laravel-5.6,dingo-api,Php,Laravel,Laravel 5.6,Dingo Api,我必须验证API的输入字段,其中的值必须是1到100之间的整数或null或甚至未设置(不需要) 因此,我的验证规则是:'privacy_status'=>“nullable | integer | min:1 | max:100”, 在我得到一个空字符串作为值之前,这一切都很正常。由于空字符串上的Laravel验证仅在字段为隐式时进行验证,因此忽略所有其他规则integer、nullable或min、max protected function isValidatable($rule, $att
null
或甚至未设置(不需要)
因此,我的验证规则是:'privacy_status'=>“nullable | integer | min:1 | max:100”,
在我得到一个空字符串作为值之前,这一切都很正常。由于空字符串上的Laravel验证仅在字段为隐式时进行验证,因此忽略所有其他规则integer、nullable或min、max
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);
}
有什么方法可以正确验证吗?编辑
您始终可以创建自定义验证规则
Validator::extendImplicit('fail_on_empty_string', function($attribute, $value, $parameters)
{
return $value === "" ? false : $value;
});
您可以像这样使用新规则:
'privacy_status' => "fail_on_empty_string|nullable|integer|min:1|max:100",
旧答案
这在Laravel文档中有描述,是您自己介绍的一个bug(尽管可能是无意中介绍的)::
默认情况下,Laravel在应用程序的全局中间件堆栈中包括TrimStrings和ConvertEmptyStringsToull中间件。这些中间件在堆栈中按App\Http\Kernel类列出。因此,如果您不希望验证程序将空值视为无效,则经常需要将“可选”请求字段标记为空。
空字符串会自动转换为null,通过验证,这是完全正确的。禁用中间件、更改它或更改您的验证规则。您只需将规则传递给它即可。这将允许字段为空,如果请求中存在该字段;它不能是空的
'privacy_policy' => 'filled|integer|min:1|max:100'
如果您想允许空字符串在被删除时使用,请改为使用当前规则
'privacy_policy' => 'present|nullable|integer|min:1|max:100'
更新
我添加了一个单元测试来证明它工作正常
public function index()
{
request()->validate([
'privacy_policy' => 'filled|integer|min:1|max:100'
]);
return response();
}
然后在测试中:
$this->get(route('test'))->assertStatus(200); // True
$this->get(route('test'), ['privacy_policy' => ''])->assertStatus(200); // False
$this->get(route('test'), ['privacy_policy' => 5])->assertStatus(200); // True
filled和nullable彼此不工作(我认为一直工作到laravel 5.4)get:privacy status字段是required@braun_lukas那你为什么不简单地使用所需的规则呢?因为我已经有了API的实现,这不会给我发送新属性。@braun_lukas好的,那么我认为填充的规则非常适合你。它或者不在请求中,或者如果它在请求中,它必须有一个值。就像我所说的,filled和nullable不能相互作用,因为filled要求属性不为null。我的Laravel没有使用这些中间件,因为我需要在其他情况下获取空字符串作为JSON API的值(如果我需要获取字符串,而不是整数),那么中间件将被禁用。因此,唯一的选择是更改我的验证规则,但没有任何验证规则组合适合我的需要,至少不是我迄今为止尝试过的组合,这很糟糕。更新了我的答案,在没有自定义代码的情况下,想不出一种方法来做到这一点。太糟糕了,没有“正常”实现这一点的方法,但像这样它工作得很好。非常感谢您更改为
返回$value!==“”;
,因为null的验证否则会失败