Laravel 8 API:PUT/PATCH方法无法接收Postman Form-Data请求
解决Laravel 8中PUT/PATCH请求Form-Data返回空数组并支持文件上传的问题
核心原因
Laravel默认不会自动解析PUT/PATCH方法的multipart/form-data请求——PHP仅处理POST方法的该类型请求,导致$request->all()返回空数组。
推荐解决方案:用POST请求模拟PUT/PATCH
这种方法无需额外编写解析逻辑,简单可靠:
Postman配置
- 请求方法选
POST - 在
Form-Data里添加字段_method,值设为PUT(或PATCH,匹配你的路由定义) - 继续添加业务字段和需要上传的文件(文件类型选择
File)
- 请求方法选
控制器代码示例
正常编写更新逻辑即可,Laravel会通过_method识别真实请求方法,同时能正常获取Form-Data中的所有字段和文件:use App\Models\YourModel; use App\Http\Resources\YourResource; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; public function update(Request $request, YourModel $model) { // 验证请求数据 $validated = $request->validate([ 'title' => 'sometimes|required|string|max:255', 'image' => 'sometimes|image|mimes:jpeg,png,jpg,gif|max:2048', // 其他字段验证规则 ]); // 处理图片上传(如果存在) if ($request->hasFile('image')) { // 删除旧图片(可选) if ($model->image) { Storage::disk('public')->delete($model->image); } // 存储新图片并更新字段 $validated['image'] = $request->file('image')->store('images', 'public'); } // 更新模型 $model->update($validated); // 返回API Resource return new YourResource($model); }路由配置
保持正常的PUT/PATCH路由定义:// 单个路由 Route::put('/your-models/{yourModel}', [YourController::class, 'update']); // 或资源路由 Route::resource('your-models', YourController::class)->only(['update']);
备选方案:自定义中间件解析PUT/PATCH Form-Data
如果坚持使用PUT/PATCH原生请求方法,可编写中间件手动解析请求数据:
创建中间件
namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class ParseMultipartPutRequest { public function handle(Request $request, Closure $next) { if (in_array($request->method(), ['PUT', 'PATCH']) && $request->isMultipartContent()) { // 解析表单数据 parse_str(file_get_contents('php://input'), $formData); $request->merge($formData); // 合并上传的文件 $request->merge($request->file()); } return $next($request); } }注册中间件
在app/Http/Kernel.php的api中间件组中添加:protected $middlewareGroups = [ 'api' => [ // 其他已有中间件 \App\Http\Middleware\ParseMultipartPutRequest::class, ], ];控制器代码同正常逻辑
此时直接使用PUT/PATCH请求方法,$request就能获取到Form-Data中的字段和文件。
排查返回空数组的额外注意点
如果API Resource返回空数组,检查你的Resource类的toArray方法是否正确配置了返回字段:
namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class YourResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, 'image' => $this->image ? asset('storage/' . $this->image) : null, // 其他需要返回的模型字段 ]; } }
内容的提问来源于stack exchange,提问作者Arslan Mughal
相关产品推荐
相关产品推荐

