最稳妥的方式是在 request()->input('key', default) 中直接传第二个参数,仅当键不存在或为 null 时生效;注意空字符串 '' 不触发默认值,需用 filled() 手动判断。

request()->input() 怎么安全地设默认值
直接在 request()->input() 里传第二个参数是最常用也最稳妥的方式,它只对当前字段生效,不影响其他逻辑。
常见错误是写成 request()->input('page') ?: 1 —— 这会在参数为 0、false、空字符串时误触发默认值,而实际这些可能是合法输入。
- 正确写法:
request()->input('page', 1),仅当键不存在或为null时才用默认值 - 注意:如果前端传了
page=(空值),Laravel 默认会转成空字符串'',不是null,所以仍不会触发默认值 - 想覆盖空字符串?得手动判断:
request()->filled('page') ? request()->integer('page') : 1
FormRequest 中怎么统一处理缺失参数
在自定义 FormRequest 类里,不能靠构造函数或 authorize() 注入默认值,真正起作用的是 rules() 和 withValidator() 配合 $this->merge()。
关键点在于:Laravel 的验证流程中,merge() 必须在验证开始前调用,否则无效;而且它只影响当前请求实例的 $this->all(),不改变原始输入源。
- 在
prepareForValidation()方法里调用$this->merge(['status' => 'draft'])是最清晰的位置 - 避免在
rules()里写'status' => 'required|string|default:draft'——default不是 Laravel 原生验证规则,会报错 - 如果依赖其他字段动态设默认值(比如
user_id未传则取当前登录用户),必须在prepareForValidation()中用Auth::id()等逻辑计算后merge()
route model binding + optional 参数怎么补默认值
当 URL 是 /posts/{post?},且 {post?} 没传时,Laravel 会把 $post 设为 null,但你可能希望它是一个新实例而不是空值。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
这时候不能靠中间件或控制器方法体去判断赋值,最佳时机是在 route binding 绑定完成之后、控制器执行之前——也就是用闭包绑定或自定义解析器。
- 在
RouteServiceProvider的boot()里注册:Route::bind('post', function ($value) { return $value ? Post::findOrFail($value) : new Post(); }); - 如果只是想让缺失时返回 404 而非 null,用
Route::model('post', Post::class)即可,不用额外处理 - 注意:这种绑定只影响 route 参数,不影响 query string 或 body 参数;别试图在这里处理
request()->input('sort')
为什么不要在中间件里全局 merge 请求参数
有人会写个中间件遍历所有预期字段,用 $request->merge([...]) 补默认值。这看起来省事,但实际埋了三个坑。
第一,merge() 返回的是新 Request 实例,你得 return $request->merge(...),否则没效果;第二,它会覆盖所有后续中间件和控制器看到的原始输入;第三,和 FormRequest 的 prepareForValidation() 冲突,导致默认值被设两次。
- 更隐蔽的问题:如果你在中间件里 merge 了
['per_page' => 15],但用户显式传了per_page=100,这个 merge 会把它覆盖掉 —— 因为merge()是无条件覆盖,不是“仅当缺失” - 真要全局兜底,默认值逻辑应集中在 FormRequest 或控制器方法头,保持意图明确
- 调试时发现参数莫名变了,优先查中间件里有没有滥用
merge()或replace()
默认值这件事,表面是少写几行代码,实际是控制数据流入的时机和语义。什么时候该由框架自动填、什么时候该由业务逻辑决定,比怎么写更重要。漏掉一个 null 和空字符串的区别,就可能让分页跳到第 0 页,或者状态变成空字符串而非预设的 draft。

















