最稳妥方式是用request()->query('key')获取url查询参数,它自动过滤、解码并返回null而非notice;设默认值用request()->query('key', default);禁用request()->get()以防混源伪造;依赖注入时应声明illuminate\http\request $request并调用$request->query()。

直接用 request()->query() 拿单个参数最稳妥
别用 $_GET 手动取,Laravel 的请求对象做了过滤和类型统一,request()->query('page') 是标准做法。它会自动处理空值、不存在键、URL 编码,返回 null 而不是触发 notice。
- 如果参数没传,
request()->query('sort')返回null,不是''或undefined - 想设默认值?加第二个参数:
request()->query('limit', 10) - 注意:不要写成
request()->get('page')——那是从所有输入源(query、post、route)混着找,容易被伪造,不安全
Request 对象注入时用 $request->query()
在控制器方法里用依赖注入更清晰,也方便单元测试。函数签名里声明 Illuminate\Http\Request $request,然后调用 $request->query('id')。
- 别漏掉 use 声明:
use Illuminate\Http\Request; - 参数名不能叫
$request以外的(比如$req),否则 Laravel 无法自动注入 - 如果同时需要多个参数,建议一次性取:
$request->query()->only(['page', 'per_page', 'q']),比连写三次query()更高效
路由参数和查询参数别混淆
URL /posts/123?draft=true 里,123 是路由参数(route parameter),draft 才是 GET 查询参数(query parameter)。前者用 $request->route('id') 或 request()->route('id') 取,后者才用 query()。
- 常见错误:把
?category=tech当成路由参数,结果死活取不到 - 调试时可打印全部查询参数:
dd($request->query());,一眼看清哪些键实际存在 - 如果 URL 是
/search?q=laravel&tag=php,$request->query('q')和$request->query('tag')各自独立,互不影响
带数组语法的 GET 参数怎么处理
像 ?tags[]=php&tags[]=laravel 这种,request()->query('tags') 会自动解析成数组 ['php', 'laravel'],不用手动 explode() 或 parse_str()。
- 但注意:如果只传一个
?tags[]=php,它仍是数组['php'],不是字符串'php' - 如果不确定是否为数组,用
is_array()判断,或统一用Arr::wrap()包一层 - 别用
request()->input('tags')替代——input()会合并 POST 数据,有安全隐患
query() 方法看着简单,但默认行为(返回 null、自动解码、数组识别)和边界情况(空字符串、全数字键、重复键)容易被忽略,上线前最好用真实 URL 多测几组边缘 case。











