laravel中get数组参数需用$request->get('tags')而非query()获取,且验证必须用'tags.*'规则;正确传参格式为tags[]=php&tags[]=laravel。

GET数组参数在Laravel路由和请求中默认不被自动解析
直接访问 /search?tags[]=php&tags[]=laravel,$request->query('tags') 会返回 null 或空数组,不是你预期的 ['php', 'laravel']。这是因为 Laravel 默认只对表单 POST 数据启用 PHP 的 register_globals-style 数组解析(依赖 php.ini 的 enable_post_data_reading 和 variables_order),而 GET 查询字符串需显式处理或符合特定格式。
request()->query() 和 request()->get() 都能读取 GET 数组,但行为有差异
request()->query('tags') 严格按查询字符串原始结构解析;request()->get('tags') 会合并 query + request(POST)数据,且对数组更宽容。多数场景推荐用 get(),尤其当接口可能同时支持 GET 和 POST 提交时。
- 正确写法:
$tags = $request->get('tags', []);—— 自动识别tags[]=a&tags[]=b或tags=a,b(如果后续手动拆分) - 错误写法:
$tags = $request->query('tags');—— 若 URL 是?tags=a,b,它返回字符串"a,b",不会自动转数组 - 注意:若前端传的是
?tags=php,laravel(逗号分隔字符串),Laravel 不会自动切分,必须手动explode(',', $request->get('tags'))
前端拼接数组参数应优先用 [] 后缀,避免用 JSON 字符串
虽然 ?tags=[%22php%22%2C%22laravel%22](即 URL 编码后的 JSON)能传过去,但服务端需 json_decode($request->get('tags'), true),既增加解析开销,又容易因编码/空格/引号问题失败。标准、兼容性最好的方式是重复键名加 []:
tags[]=php&tags[]=laravel&tags[]=vue
这种格式被所有主流浏览器、Axios、Fetch、curl 原生支持,PHP 本身($_GET)也会自动聚合成数组,Laravel 的 request()->get() 可直接消费。
- 不要写:
?tags=["php","laravel"](未编码,非法 URL) - 不要写:
?tags=[%22php%22%2C%22laravel%22](过度设计,无必要) - 要写:
?tags[]=php&tags[]=laravel(简洁、可靠、无需额外 decode)
验证和过滤数组参数时,array 规则必须配合 * 子规则
Laravel 的验证器默认把 'tags' => 'array' 当作“字段存在且是数组”,但不会校验数组内每个元素。若要求所有 tag 非空且为字符串,必须展开:
['tags' => 'array', 'tags.*' => 'required|string|min:1']
否则,?tags[]=(空字符串)或 ?tags[]=123(数字)会绕过校验。
-
tags.*是关键:表示“tags数组中每个元素” - 漏掉
.*就等于没校验数组内容 - 若允许空元素,改用
'tags.*' => 'nullable|string'
.* 展开,以及误以为 query() 和 get() 行为一致。GET 数组看着简单,但跨前后端、跨验证、跨 PHP 版本时,细节错一点就静默失效。











