Laravel中$request->collect()无法传递文件至服务类的问题
为什么$request->collect()传参拿不到文件,$request->all()却可以?
核心原因
$request->all()会返回所有请求数据,包括multipart/form-data上传的文件(文件会被封装成UploadedFile实例),它是把普通表单字段和文件数据合并后返回的数组。$request->collect()默认只处理普通表单输入字段,不会自动包含文件。因为Laravel请求的collect()方法底层是从$request->input()中取数据,而上传的文件存在$request->files()独立集合里,不属于普通输入字段范围。
具体差异
调用$request->collect()时,相当于只提取了请求里的文本、数字这类常规参数,完全跳过了文件部分;而$request->all()会主动把input和files两个数据集合并,所以能拿到文件。
解决办法
如果要通过Collection传递包含文件的数据,有两种简单方式:
- 手动合并输入和文件后转成Collection:
// 控制器代码修改 $mergedData = collect(array_merge($request->all(), $request->files->all())); $result = $this->userService->storeUser($mergedData);
- 用Collection的merge方法整合文件:
// 控制器代码修改 $data = $request->collect()->merge($request->files->all()); $result = $this->userService->storeUser($data);
注意点
服务类里拿到Collection后,文件会以UploadedFile实例的形式存在,比如要获取名为avatar的文件,直接用$data->get('avatar')即可,和在控制器里用$request->file('avatar')的用法一致。
内容的提问来源于stack exchange,提问作者M Mahfouz
相关产品推荐
相关产品推荐

