在Laravel项目开发中,经常需要在路由中传递数组类型的参数,满足批量操作、多条件筛选等业务需求。常见的传递场景包括前端提交多个ID进行批量删除、传递多个筛选条件查询数据等,不同的请求方式对应不同的参数传递和接收逻辑。

GET请求中传递数组参数
路由定义方式
GET请求的数组参数通常通过查询字符串传递,路由定义不需要特殊处理,直接定义普通路由即可。示例如下:
<?php
// routes/web.php
use IlluminateSupportFacadesRoute;
use AppHttpControllersTestController;
// 定义GET路由,无需在路由路径中声明数组参数
Route::get('/test-array-params', [TestController::class, 'getArrayParams']);
前端传递参数方式
前端传递数组参数时,需要在参数名后添加[]标识,多个值对应同一个参数名即可。示例如下:
<!-- 方式一:直接在URL中拼接查询字符串 -->
<a href="/test-array-params?ids[]=1&ids[]=2&ids[]=3">传递数组参数</a>
<!-- 方式二:表单提交 -->
<form action="/test-array-params" method="get">
<input type="checkbox" name="ids[]" value="1" checked>ID1
<input type="checkbox" name="ids[]" value="2" checked>ID2
<input type="checkbox" name="ids[]" value="3" checked>ID3
<button type="submit">提交</button>
</form>
控制器接收参数
在控制器中可以通过request()助手函数或者Request对象直接接收数组参数,示例如下:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class TestController extends Controller
{
public function getArrayParams(Request $request)
{
// 直接获取数组参数,默认返回数组
$ids = $request->input('ids');
// 也可以使用get方法
$ids2 = $request->get('ids');
// 如果参数不存在,返回默认值空数组
$ids3 = $request->input('ids', []);
return response()->json([
'ids' => $ids,
'type' => gettype($ids)
]);
}
}
POST请求中传递数组参数
路由定义方式
POST请求的路由定义和GET类似,使用post方法定义即可,示例如下:
<?php
// routes/web.php
Route::post('/test-post-array', [TestController::class, 'postArrayParams']);
前端传递参数方式
POST请求可以通过表单或者AJAX传递数组参数,表单传递时同样需要给参数名加[],AJAX传递时直接传递数组格式的值即可。示例如下:
<!-- 表单方式 -->
<form action="/test-post-array" method="post">
@csrf
<input type="text" name="names[]" value="张三">
<input type="text" name="names[]" value="李四">
<input type="text" name="names[]" value="王五">
<button type="submit">提交</button>
</form>
<!-- AJAX方式 -->
<script>
function postArrayData() {
let data = {
'_token': '{{ csrf_token() }}',
'names': ['张三', '李四', '王五']
};
fetch('/test-post-array', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(res => console.log(res));
}
</script>
控制器接收参数
POST请求的数组参数接收方式和GET一致,示例如下:
<?php
public function postArrayParams(Request $request)
{
// 接收表单提交的数组
$names = $request->input('names');
// 接收JSON格式的数组
$names2 = $request->json('names');
return response()->json([
'names' => $names,
'names2' => $names2
]);
}
路由路径中传递数组参数
如果需要在路由路径中传递数组参数,可以通过路由参数绑定实现,不过这种方式更适合参数数量固定的场景。示例如下:
<?php
// 路由定义,使用多个参数占位符
Route::get('/test-path-array/{param1}/{param2}/{param3}', [TestController::class, 'pathArrayParams']);
控制器中接收时可以将多个参数组合成数组:
<?php
public function pathArrayParams($param1, $param2, $param3)
{
$params = [$param1, $param2, $param3];
return response()->json(['params' => $params]);
}
常见问题与排查
- 参数接收为null:检查前端传递的参数名是否和后端接收的参数名一致,GET请求检查查询字符串是否正确,POST请求检查是否携带CSRF令牌(web路由组默认开启CSRF保护)。
- 参数不是数组格式:检查前端传递数组时是否给参数名加了
[],如果是AJAX传递JSON数据,检查前端是否正确序列化了数组。 - 路由参数绑定错误:如果是在路径中传递数组,检查路由定义的占位符数量和实际传递的参数数量是否匹配,避免参数缺失导致404错误。
注意:如果传递的数组参数包含特殊字符,建议在前端进行URL编码,后端接收后会自动解码,避免参数格式错误。