Laravel的boolean验证规则不自动转换"true"/"false"字符串,需在验证前用filter_var预处理为布尔值,否则会报错;推荐在FormRequest中重写prepareForValidation方法实现安全转换。

Boolean字段校验时值被转成true/false但实际传的是"true"/"false"字符串
Laravel 的 boolean 验证规则本身**不自动转换字符串**,它只接受 PHP 布尔值(true、false)或可被 filter_var($value, FILTER_VALIDATE_BOOLEAN) 接受的值(如 "1"、"0"、"on"、"off"、"yes"、"no")。但前端常发 "true"、"false" 字符串,这时直接写 'status' => 'boolean' 会失败。
常见错误现象:"The status field must be true or false." —— 即使请求体里是 "status": "true"。
- 必须配合
nullable或显式转换,否则null或空字符串也会报错 - 不要依赖框架“自动识别”,Laravel 8+ 默认不把
"true"当布尔真值 - 若用
json请求体,Content-Type: application/json下 JSON 解析后"true"仍是字符串,不会变成布尔
用boolean规则前先做类型预处理(推荐方案)
最稳的方式不是靠验证规则兜底,而是在验证前把字段转成布尔。Laravel 的 FormRequest 提供了 prepareForValidation() 方法,适合干这事。
示例:对 is_active 字段做安全转换
protected function prepareForValidation()
{
$this->merge([
'is_active' => filter_var($this->is_active, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
]);
}
-
FILTER_NULL_ON_FAILURE让非法输入(如"maybe")变null,后续required|boolean就能报错 - 避免用
(bool)强转 ——(bool) "0"是true,这和业务直觉相反 - 如果字段允许为空,验证规则写成
'is_active' => 'nullable|boolean',别漏掉nullable
API请求中boolean字段兼容性陷阱
不同客户端传布尔的方式五花八门:Postman 可能发原始 JSON 字符串,Flutter 默认序列化 true 为 1,iOS 有时用 YES/NO。单靠一个 boolean 规则扛不住。
- 别在控制器里手动写
if ($request->input('flag') === 'true')—— 分散、难维护、易漏 - 如果项目大量用字符串布尔,考虑封装一个全局中间件或基类
FormRequest统一处理常见字段名(如is_*、has_*) - 注意数据库字段类型:MySQL 的
TINYINT(1)存布尔时,Eloquent 会自动转,但前提是传进来的已经是布尔值,不是字符串
调试时怎么确认字段到底是什么类型
别猜。加一行日志或断点看原始值:
Log::debug('raw is_published', ['value' => $request->is_published, 'type' => gettype($request->is_published)]);
- JSON 请求体中的
"is_published": true→ 类型是boolean - JSON 请求体中的
"is_published": "true"→ 类型是string - 表单请求(
application/x-www-form-urlencoded)中勾选 checkbox → 值是"on"或不存在;不勾选 → 字段压根不出现,$request->input()返回null
真正麻烦的不是规则写不对,而是你根本没意识到传进来的是字符串——尤其当 Postman 里看着像布尔,但实际是双引号包着的。


















