You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel处理Inertia发送的PUT请求FormData为空问题排查

解决Inertia.js PUT请求FormData无法被Laravel正确解析的问题

你遇到的问题是Inertia发送PUT请求时,Laravel无法解析FormData导致$request->all()返回空数组,但php://input能读取到原始数据,核心原因是Laravel默认只解析POST请求的FormData,对于直接发送的PUT/PATCH请求,请求解析器不会处理表单数据。

解决方法一:使用POST请求模拟PUT(推荐)

Laravel支持通过POST请求携带_method字段来模拟PUT/PATCH请求,这是符合Laravel路由机制的标准做法,只需修改前端代码:

  1. 在FormData中添加_method字段:
const formData = new FormData();
formData.append('first_name', model.first_name);
formData.append('last_name', model.last_name);
formData.append('email', model.email);
formData.append('is_superuser', model.is_superuser ? 1 : 0); // 建议转成数字,避免布尔值被转成字符串
formData.append('is_active', model.is_active ? 1 : 0);
formData.append('password', model.password || '');
formData.append('profile_pic', model.profile_pic);
formData.append('_method', 'PUT'); // 新增此字段,告诉Laravel这是PUT请求
  1. 将router.put改为router.post:
router.post(route('user.update', { id: userData.id }), formData, {
    preserveScroll: true,
    onError: (errors) => {
        const errorList = Object.entries(errors)
            .map(([, value]) => `${value}`)
            .join('\n');
        alertDialogService.setMessage(errorList).show();
    },
    forceFormData: true, // 确保发送FormData
});

这样修改后,Laravel会正确识别请求为PUT,同时解析FormData,$request->all()就能获取到所有字段。

解决方法二:调整Laravel请求解析(不推荐)

如果必须使用PUT请求,可以自定义中间件手动解析FormData,但这种方式不符合Laravel的设计规范,示例如下:

创建中间件ParsePutFormData.php:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ParsePutFormData
{
    public function handle(Request $request, Closure $next)
    {
        if ($request->isMethod('PUT') && str_contains($request->header('Content-Type'), 'multipart/form-data')) {
            $request->merge($request->all());
        }
        return $next($request);
    }
}

然后在app/Http/Kernel.php的web中间件组中添加该中间件:

protected $middlewareGroups = [
    'web' => [
        // ...其他中间件
        \App\Http\Middleware\ParsePutFormData::class,
    ],
];

额外注意事项

  • 布尔值处理:FormData会将布尔值转为字符串("true"/"false"),建议前端转成1/0,或者在Laravel中用$request->boolean('is_superuser')来获取正确的布尔值。
  • 文件上传:如果profile_pic是文件对象,确保它是有效的File实例,Inertia配合forceFormData: true能正确处理文件上传。

内容的提问来源于stack exchange,提问作者Saqif Haque

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:47:19