Laravel字符串验证允许空字符串。

30

在 Laravel 5.7 中,我正在使用表单请求验证:

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'string|max:50'
    ];
}
如果我使用这个有效载荷向我的API提交请求:
{
  "age": 24,
  "title": ""
}

Laravel返回错误:

{
    "message": "The given data was invalid.",
    "errors": {
        "title": [
            "The title must be a string."
        ]
    }
}

我希望这个验证能够通过,因为标题是一个字符串,即使是空字符串。该如何设计验证规则以允许空字符串?


尝试同时添加 presentrequired 验证器。 - ka_lin
3
“Present”(存在)和“required”(需要)这两个词并不能描述这一属性,因为该属性不需要存在也不是必需的。 - GluePear
6个回答

56

您需要使用nullable才能允许一个空字符串。

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'nullable|string|max:50'
    ];
}

1
nullable - 验证字段可以为null。这在验证诸如字符串和整数等可能包含null值的原始数据时特别有用。 - ka_lin
3
这不允许空字符串,这仅会忽略空字符串,并将其视为“null”。如果我们想用空字符串覆盖现有的“title”字段,该怎么办? - GluePear
6
еҰӮжһңдҪ жғіиҝҷж ·еҒҡпјҢдҪ иҝҳйңҖиҰҒд»ҺдҪ зҡ„дёӯй—ҙ件дёӯзҰҒз”Ё\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull ::classгҖӮиҜҘдёӯй—ҙ件дјҡиҮӘеҠЁе°Ҷз©әеӯ—з¬ҰдёІиҪ¬жҚўдёәnullгҖӮд»Һж•°жҚ®еә“规иҢғеҢ–зҡ„и§’еәҰжқҘзңӢпјҢд»ҘnullдҪңдёәеҖјиҰҒжҜ”з©әеӯ—з¬ҰдёІжӣҙеҘҪгҖӮ - George Hanson
1
我确认这个是有效的。如果你将特定的字段留空,nullable 会使其通过为空的检查。这里是文档链接 - Pathros
如果你有$request->file('image')这个问题,有没有什么解决方案?它既可以为空,有时也无法正常工作。 - ATG

22

尝试查看是否启用了ConvertEmptyStringsToNull中间件,这可能会解释此行为,详见文档


谢谢,这很有用。我不太自信删除那个中间件,以防它在其他地方使用。但是这解释了行为。 - GluePear

5

0
避免触碰中间件设置。 相反,在验证运行之前使用Laravel内置函数来操作数据。 在验证类内部。
protected function prepareForValidation()
    {
        if($this->title == null )
            $this->merge(['title'=>'']);
    }

0

我会尝试

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'string|sometimes'
    ];
}

只有当标题存在时,才会进行验证。


虽然允许为空,但当您希望它始终存在时,它并未解决问题。 - PatricNox

0

当你有这个规则时,被接受的答案并不能解决问题:

return [
  "title" => "sometimes|string",
];

在这种情况下,您需要明确指定字符串实际上是“可为空”的(即使ConvertEmptyStringsToNull中间件处于活动状态,已在Laravel 8.77.1上进行了测试)。
因此,这个示例将允许在“title”键上传递一个空字符串:
return [
  "title" => "sometimes|string|nullable",
];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接