Laravel 字符串验证以允许空字符串
Posted
技术标签:
【中文标题】Laravel 字符串验证以允许空字符串【英文标题】:Laravel string validation to allow empty strings 【发布时间】:2019-07-16 17:49:26 【问题描述】:在 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."
]
我希望它能够通过验证,因为标题是一个字符串,尽管它是一个空的。应该如何制定验证以允许空字符串?
【问题讨论】:
尝试添加present
或 required
验证器
@ka_lin Present and required 不描述这个属性,它不需要存在也不是必需的。
【参考方案1】:
你需要nullable
来允许一个空字符串
public function rules()
return [
'age' => 'integer',
'title' => 'nullable|string|max:50'
];
【讨论】:
nullable - 验证中的字段可能为空。这在验证可以包含空值的字符串和整数等原语时特别有用。 这不允许空字符串,这只是忽略空字符串,将其视为null
。如果我们想用空字符串覆盖现有的title
字段怎么办?
@GluePear 如果你想这样做,你还需要从你的中间件中禁用\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class
。该中间件会自动将空字符串转换为 null。从数据库规范化的角度来看,将null
作为值而不是空字符串会更好。
我确认这确实有效。如果您将该特定字段留空,nullable
会使其为空。 Here are the docs.【参考方案2】:
尝试查看 ConvertEmptyStringsToNull
中间件是否处于活动状态,然后它将解释此行为,请参阅 docs
【讨论】:
谢谢,这很有用。如果它在其他地方使用,我没有信心删除该中间件。但它解释了这种行为。【参考方案3】:有present
规则检查是否存在一个键,但让它为空。
#现在
现在 验证字段必须存在于输入数据中,但可以为空。
https://laravel.com/docs/5.7/validation#rule-present
【讨论】:
【参考方案4】:我会努力的
public function rules()
return [
'age' => 'integer',
'title' => 'string|sometimes'
];
这只会在标题存在时验证它。
【讨论】:
当您希望它始终存在时不回答问题,尽管允许为空。【参考方案5】:避免接触中间件设置。
在验证运行之前使用 Laravel 内置函数来操作数据。
内部验证类
protected function prepareForValidation()
if($this->title == null )
$this->merge(['title'=>'']);
【讨论】:
【参考方案6】:也许添加min
约束可以解决问题?
public function rules()
return [
'age' => 'integer',
'title' => 'string|min:0|max:50'
];
【讨论】:
这是错误的,指定更严格的规则不起作用。以上是关于Laravel 字符串验证以允许空字符串的主要内容,如果未能解决你的问题,请参考以下文章
JS验证字符串是否以某一子串结尾,验证字符串是否以某一子串开始
Laravel 8.0:将模型中的“非空”字符串属性保存为空字符串
2021-10-12:验证回文串。给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串 。输入: “A man, a plan