Laravel中PUT/PATCH方法无法获取form-data数据的解决求助
在Laravel中用PUT/PATCH方法获取form-data数据的解决方案
问题原因
Laravel默认仅对POST请求自动解析multipart/form-data格式的请求体,PUT/PATCH请求的form-data不会被框架自动解析,导致$request->all()返回空数组。
解决方案
方法一:用POST请求模拟PUT/PATCH(推荐)
这是Laravel官方适配的方案,既能满足请求方法的语义要求,又能完美解析form-data:
- 在Postman中选择请求方法为
POST - 在form-data中添加键为
_method的字段,值设为PUT或PATCH - 发送请求后,Laravel会识别为对应的PUT/PATCH请求,同时正常解析所有form-data参数和文件
控制器代码无需修改,继续使用原逻辑即可:
public function update(Request $request, string $id) { $data = $request->all(); dd($data); }
方法二:自定义中间件解析PUT/PATCH的form-data
如果必须使用原生PUT/PATCH请求,可通过中间件手动解析请求体:
- 创建中间件文件
app/Http/Middleware/ParsePutFormData.php:
<?php namespace App\Http\Middleware; use Closure; use Symfony\Component\HttpFoundation\FileBag; use Symfony\Component\HttpFoundation\ParameterBag; class ParsePutFormData { public function handle($request, Closure $next) { $isPutOrPatch = $request->isMethod('PUT') || $request->isMethod('PATCH'); $isMultipart = str_contains($request->headers->get('Content-Type'), 'multipart/form-data'); if ($isPutOrPatch && $isMultipart) { // 解析表单参数 parse_str($request->getContent(), $formData); // 保留文件数据 $files = $request->files->all(); $request->request = new ParameterBag($formData); $request->files = new FileBag($files); } return $next($request); } }
- 在
app/Http/Kernel.php的$middleware数组中注册该中间件:
protected $middleware = [ // ...其他中间件 \App\Http\Middleware\ParsePutFormData::class, ];
- 之后使用原生PUT/PATCH请求发送form-data,控制器就能通过
$request->all()获取完整数据。
方法三:控制器内手动解析(临时方案)
如果仅单个控制器需要处理,可直接在方法内手动解析请求体:
public function update(Request $request, string $id) { $isPutOrPatch = $request->isMethod('PUT') || $request->isMethod('PATCH'); $isMultipart = str_contains($request->headers->get('Content-Type'), 'multipart/form-data'); if ($isPutOrPatch && $isMultipart) { $content = $request->getContent(); $boundary = substr($content, 0, strpos($content, "\r\n")); $parts = array_slice(explode($boundary, $content), 1, -1); $data = []; foreach ($parts as $part) { if (preg_match('/name="([^"]+)"/', $part, $matches)) { $name = $matches[1]; $value = trim(substr($part, strpos($part, "\r\n\r\n") + 4), "\r\n"); $data[$name] = $value; } } // 合并文件数据 $data = array_merge($data, $request->files->all()); } else { $data = $request->all(); } dd($data); }
内容的提问来源于stack exchange,提问作者Selçuk
相关产品推荐
相关产品推荐

