如何在Laravel中实现仅输入字段存在数据时才执行验证?
Laravel 表单空字段验证报错问题排查
背景
我有一个用于数据采集的Laravel表单,创建和更新表数据都复用该表单。我的需求是仅当输入字段包含数据时才对其进行验证,最初编写的验证逻辑如下:
$validated = $request->validate([ 'site_name' => 'sometimes|string', 'site_email' => 'sometimes|email', 'site_keywords' => 'sometimes|string', 'site_description' => 'sometimes|string', 'site_acronym' => 'sometimes|string|max:7', 'site_favicon' => 'sometimes|mimes:jpg,png,jpeg,svg', 'site_logo' => 'sometimes||mimes:jpg,png,jpeg,svg', 'site_currency' => 'sometimes|string', 'site_currency_symbol' => 'sometimes|string', ]);
遇到的问题
表单提交时,Laravel会为空输入字段返回报错,比如第一条验证规则就会抛出*"The site name must be a string."*的错误提示。
错误原因
你对sometimes验证规则的作用理解有误:
- Laravel中
sometimes的规则逻辑是「仅当请求参数中包含该字段时,才执行后续的验证规则」 - 普通表单提交时,即便输入框留空,对应的字段也会以空字符串的形式被发送到后端,该字段实际是存在于请求参数中的,所以
sometimes不会跳过验证 - 后续的
string、email等规则默认不允许值为空,因此会抛出格式校验错误
解决方案
在验证规则中新增nullable规则即可,该规则允许字段值为null/空字符串,仅当字段有非空值时才会执行后续的格式校验,正好匹配你「仅字段有数据时才验证」的需求。
修改后的正确验证逻辑如下:
$validated = $request->validate([ 'site_name' => 'string|nullable|sometimes', 'site_email' => 'email|nullable|sometimes', 'site_keywords' => 'string|nullable|sometimes', 'site_description' => 'string|nullable|sometimes', 'site_acronym' => 'string|nullable|sometimes|max:7', 'site_favicon' => 'mimes:jpg,png,jpeg,svg|nullable|sometimes', 'site_logo' => 'mimes:jpg,png,jpeg,svg|nullable|sometimes', 'site_currency' => 'string|nullable|sometimes', 'site_currency_symbol' => 'string|nullable|sometimes', ]);
内容的提问来源于stack exchange,提问作者Vic Iyke
相关产品推荐
相关产品推荐

