request()->has() 是 laravel 5.2+ 唯一推荐的参数存在性判断方法,仅检查键是否存在,不关心值是否为空;而 filled() 则用于判断键存在且值非空(如 ''、null、[] 等均视为无效),二者适用场景不同,不可混用。

直接用 request()->has() 判断最稳妥,别再用 Input::has() ——那个类早在 Laravel 5.2 就被废弃了,现在调用会报 Class 'Input' not found 错误。
request()->has() 是当前标准写法
这是 Laravel 5.2+ 唯一推荐、且默认可用的方式。它不区分 GET/POST,只看当前请求里有没有这个键。
-
request()->has('page')→ 返回true或false -
request()->has(['page', 'sort'])→ 同时检查多个参数,全部存在才返回true - 注意:它只判断键是否存在,不管值是不是空字符串或
0;比如?q=或?id=0都算“存在”
request()->filled() 更适合“有值且非空”的场景
如果你真正关心的是“用户传了有效值”,而不是单纯“URL里写了这个参数”,就该用 filled()。
-
request()->filled('q')→?q=、?q=null、?q=0都返回false -
request()->filled('id')→?id=123返回true,?id=0返回false - 底层逻辑等价于
!empty(request()->get('key')),但更安全(不会触发 PHP 的empty()对 0 的误判)
别踩这些坑
几个高频翻车点,尤其容易在老项目迁移时出问题:
- 还在用
Input::has()?它依赖Illuminate\Support\Facades\Input,Laravel 5.2 起已移除,硬用会直接报错 - 用
isset($_GET['xxx'])?绕过 Laravel 请求生命周期,拿不到 POST 数据、无法兼容表单请求伪造(CSRF)、也拿不到路由绑定的参数 - 用
request()->get('xxx') !== null判断?错——request()->get('xxx', 'default')默认值机制会让这个判断失效;而且get()返回的是字符串或默认值,不是原始存在性 - 混淆
has()和filled():前者是“URL里带这个 key”,后者是“这个 key 有真实业务意义的值”
实际开发中,has() 多用于分页、筛选开关类参数(如 ?with_trash),filled() 多用于搜索、ID 查询等需要真实值的场景。漏掉这个区分,很容易让 ?search=0 被当成没填搜索词处理。











