Php 空字符串验证不需要的整数

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

我必须验证API的输入字段,其中的值必须是1到100之间的整数或
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的验证否则会失败