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

Laravel使用AJAX提交FormData更新表单报target class不存在错误

问题根因

该报错和FormData序列化表单的逻辑无关,是配置缺失导致Laravel路由匹配错位:

  • PHP原生不支持PATCH、PUT、DELETE类请求方法,Laravel依赖请求参数中的_method字段识别实际请求动作。直接在AJAX配置中写type: "PATCH"配合FormData提交时,因为你设置了processData: false,jQuery不会自动注入_method参数,Laravel无法识别请求类型,会将其按普通请求处理
  • 你的AJAX配置漏了contentType: false参数,FormData提交时必须关闭jQuery默认的Content-Type头设置,否则multipart表单边界会被错误配置,请求参数解析异常
  • 你大概率是用Route::resource('Form', FormController::class)定义的路由,当请求未被正确识别为PATCH类型时,Laravel会错误匹配路由规则,把URL段中的Form解析为控制器类名,因此抛出找不到App\Http\Controllers\Form类的错误(丢失Controller后缀)。
修复方法

直接修改AJAX提交代码即可,不需要调整控制器、路由或Blade模板:

$("#formUpdate").on("submit", function (event) {
    event.preventDefault();

    var formId = $('#formId').val();
    var url = '/Form/' + formId;
    var form = this;
    let formData = new FormData(form);
    // 手动添加_method参数,告知Laravel实际请求类型为PATCH
    formData.append('_method', 'PATCH');

    $.ajax({
        url: url,
        type: "POST", // 统一使用POST发起请求,靠_method参数识别实际动作
        headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
        data: formData,
        processData: false,
        contentType: false, // 新增该配置,关闭jQuery默认的Content-Type设置
        success: function (response) {
            console.log(response);
        },
    });
});
补充说明

你之前逐个定义参数发PATCH能正常运行,是因为jQuery处理普通对象参数时会自动处理请求方法识别的相关逻辑;换成FormData后因为关闭了参数处理逻辑,这套自动机制失效才触发问题。所有用FormData提交PUT/PATCH/DELETE请求的场景,都建议用「POST请求+传_method参数」的写法,兼容性最好,不会出现请求类型识别错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:15:47