Laravel中request->merge()与request->add()方法的区别是什么
Laravel 中
$request->merge() 与 $request->add() 方法的区别 两个方法都能往请求实例里追加参数,但底层逻辑、行为差异很大,具体区别如下:
- 所属来源不同
add()是 Symfony 底层ParameterBag类的原生方法,直接操作请求绑定的原始参数集合;merge()是 Laravel 框架在InteractsWithInput特性里封装的上层方法,操作的是框架整理过的输入数据源,覆盖GET参数、POST参数、JSON请求体参数,不会直接改动路由参数、上传文件这类独立存储的内容。 - 键名冲突时的处理逻辑完全不同
add()遇到已存在的键名会直接全量覆盖对应值,哪怕原值是多层嵌套数组,也会直接替换成你传入的新值,不会做递归合并:// 原有参数:['user' => ['name' => '张三', 'age' => 20]] $request->add(['user' => ['gender' => '男']]); // 处理后参数:['user' => ['gender' => '男']],原有的name、age字段会直接丢失merge()遇到数组类型的同键名参数会做递归合并,只有同路径的基础类型值才会覆盖,不会冲掉原有嵌套结构:// 原有参数:['user' => ['name' => '张三', 'age' => 20]] $request->merge(['user' => ['gender' => '男']]); // 处理后参数:['user' => ['name' => '张三', 'age' => 20, 'gender' => '男']],原有字段完整保留 - 使用适配性不同
merge()完全适配 Laravel 自身的参数读取链路,追加完的参数可以正常通过input()、validate()、only()等框架方法读取使用,且方法返回请求实例本身,支持链式调用,是日常业务开发的首选。add()直接操作底层参数包,不会同步框架层的参数缓存,部分场景下会出现$request->get()能读到值、但$request->input()读不到的问题,且没有返回值,仅适合需要直接修改Symfony原生参数集合的特殊场景,日常业务不推荐用。
内容的提问来源于stack exchange,提问作者farshidpg
相关产品推荐
相关产品推荐

