laravel中页面跳转携带数组参数需用route()或redirect()->route()配合命名路由,自动处理url编码与数组序列化;路径参数仅支持关联数组且键名须匹配占位符,查询参数才支持多维数组传递。

在 Laravel 中实现页面跳转并携带数组参数,常见于列表页跳转详情页时传入多个筛选条件、批量操作 ID 列表或预填充表单字段等场景。直接拼接 URL 查询字符串不仅易出错,还破坏路由语义和安全性;必须依赖框架原生支持的参数传递机制,否则数组会被序列化为字符串或完全丢失。
用 route() 生成带数组查询参数的 URL
适用于跳转到 GET 路由(如搜索页、过滤页),且目标路由不定义路径参数,仅接收 query 参数。
第一步:确保路由已命名,且控制器方法能接收 request()->query() 或 $request->all()
第二步:在 Blade 或控制器中调用 route(),将数组作为第二个参数的子键传入
route('search.results', ['q' => 'php', 'tags' => ['laravel', 'blade'], 'page' => 2])
这会生成类似 /search?q=php&tags[]=laravel&tags[]=blade&page=2 的 URL。Laravel 自动将数组键名后加 【[]】,保证后端能正确解析为数组。
⚠️注意:若数组值含特殊字符(如空格、&、=),route() 会自动 urlencode,无需手动处理。
用 redirect()->route() 跳转并附带数组参数
适用于表单提交后重定向至结果页,并需保留筛选条件或批量 ID 列表。
方法一:直接传数组(推荐)
return redirect()->route('orders.index', ['status' => 'shipped', 'ids' => [101, 102, 105]]);
方法二:链式 withQuery()(Laravel 9.2+ 支持)
return redirect()->route('orders.index')->withQuery(['ids' => [101, 102, 105], 'export' => true]);
两种方式均能正确渲染含数组的查询串。但 【withQuery() 不会覆盖原有 query 参数,适合追加】,而直接传数组会完全替换 URL 中的 query 部分。
跳转时携带关联数组作为路径参数(非 query)
仅适用于路由定义中明确声明了多个占位符,例如 /report/{year}/{month}/{category}。此时不能传普通数组,必须严格匹配占位符顺序或键名。
✅ 正确写法(关联数组,键名与路由占位符一致):
route('report.detail', ['year' => 2026, 'month' => '07', 'category' => 'sales'])
❌ 错误写法(索引数组错序):
route('report.detail', [2026, 'marketing', '07']) // 生成 /report/2026/marketing/07,语义错误
⚠️关键点:【路径参数不支持嵌套数组或纯数值索引数组传入多维结构】。如需传 ID 列表,必须走 query 参数路径,而非 {ids?} 这类占位符——Laravel 不解析 {ids?} 为数组,只会当作字符串。
在控制器中接收并验证数组参数
无论来自 route() 还是 redirect()->route(),数组参数最终都进入请求对象。
使用 $request->input('tags', []) 安全获取,默认返回空数组而非 null
用 $request->validate(['tags' => 'required|array', 'tags.*' => 'string|in:laravel,php,js']) 校验数组内容
若前端传入 tags[]=laravel&tags[]=vue,$request->tags 和 $request->input('tags') 均可直接获得 ['laravel', 'vue'],无需额外 parse。











