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
相关产品推荐
相关产品推荐

