InertiaJS向Laravel9发送PUT/PATCH请求时参数为空求助
InertiaJS PUT/PATCH请求参数无法被Laravel解析的解决方法
问题根源:PHP本身不支持自动解析PUT/PATCH方法的multipart/form-data请求,导致Laravel无法将表单参数加载到request的parameters集合中,只能在content属性中看到原始表单数据。
1. 无文件上传时:使用JSON格式提交请求
确保用Inertia内置的useForm钩子创建表单实例,Inertia会自动以JSON格式发送请求,Laravel可直接解析参数:
// 前端(React示例,Vue用法类似) import { useForm } from '@inertiajs/react' const form = useForm({ title: props.post.title, // 其他表单字段 }) const updatePost = () => { form.patch(route('posts.update', props.post.id)) }
后端直接通过request('title')或$request->title即可获取参数。
2. 有文件上传时:手动构造FormData并添加_method字段
上传文件必须使用FormData,但PHP无法识别PUT/PATCH方法的multipart请求,需手动添加_method字段指定请求方法:
// 前端 const formData = new FormData() formData.append('title', 'some title') formData.append('cover_image', document.getElementById('cover').files[0]) // 示例文件字段 formData.append('_method', 'PATCH') // 关键:模拟PATCH请求 Inertia.patch(route('posts.update', props.post.id), formData, { headers: { 'Content-Type': 'multipart/form-data', }, })
后端通过request('title')获取文本参数,用$request->file('cover_image')获取文件。
补充:后端直接解析原始content(不推荐)
若不想修改前端,可在后端手动解析content中的表单数据:
// 后端Laravel $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 (strpos($part, 'Content-Disposition') === false) continue; preg_match('/name="([^"]+)"/', $part, $matches); $name = $matches[1]; $value = trim(substr($part, strpos($part, "\r\n\r\n") + 4)); $value = rtrim($value, "\r\n"); $data[$name] = $value; } dd($data['title']); // 输出"some title"
该方法繁琐,优先推荐前两种前端处理方式。
内容的提问来源于stack exchange,提问作者Mohammad Hossein
相关产品推荐
相关产品推荐

