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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:05:59