Laravel 不处理 PUT 请求中的 FormData

问题描述 投票:0回答:1

我在尝试使用 Inertia 在 Laravel 中使用 FormData 发送 PUT 请求时遇到问题。我需要更新用户,但 PUT 请求似乎被忽略,并且 Laravel 没有正确处理 FormData。我通过 Inertia.js 发送 PUT 请求,但是当我在 Laravel 中检查请求时,发现请求正文为空。

这是我遵循的流程:

我正在尝试从前端发送 FormData(通过 Inertia.js)。 PUT 请求未按预期得到处理。 我使用 dd($request->all()) 检查了 Laravel 请求主体,结果发现它是空的。 这是我尝试过的以及请求是如何空的:

控制器中的调试代码(Laravel):

public function update(Request $request, $id)
{
    // Debugging the request body
    dd($request->all()); // This shows an empty array
    
    // Trying to check php://input
    $rawData = file_get_contents("php://input");
    dd($rawData); // This shows data
}

前端(带有 FormData 的 Inertia.js):

javascript

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);
formData.append('is_active', model.is_active);
formData.append('password', model.password || ''); // Optional field
formData.append('profile_pic', model.profile_pic);


router.put(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, // Ensure FormData is sent
});

Laravel 控制器:

php
public function update(Request $request, $id)
{
    dd($request->all()); // Check the incoming request data
    
    $validatedData = $request->validate([
        'first_name' => 'required|max:30',
        'last_name' => 'required|max:30',
        'email' => 'required|email|unique:auth_users,email,' . $id,
        'is_superuser' => 'required|boolean',
        'is_active' => 'required|boolean',
        'password' => ['nullable', 'min:8'],
    ]);

    // Find and update the user data
    $user = User::findOrFail($id);
    $user->update($validatedData);

    return redirect()->route('user.index')->with('success', 'User updated successfully.');
}

我观察到的: 当我检查 Laravel 请求时,发现请求正文为空($request->all() 返回一个空数组)。 我尝试使用 file_get_contents("php://input") 读取原始数据,它显示了 formData。

我该如何修复它?使用vue惯性是否需要任何额外的配置?

laravel vue.js put inertiajs
1个回答
0
投票

解决方法包括将请求方法更改为 POST,同时通过向 FormData 添加 _method 字段来通知 Laravel 这是一个 PUT 请求。

以下是实施此解决方案的方法:

前端(带有 FormData 的 Inertia.js)

不要直接发送 PUT 请求,而是修改 FormData 并使用 POST 请求:

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);
formData.append('is_active', model.is_active);
formData.append('password', model.password || ''); // Optional field
formData.append('profile_pic', model.profile_pic);

// Add the _method field to indicate this is a PUT request
formData.append('_method', 'PUT');

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, // Ensure FormData is sent
});

此解决方案无需更改 Laravel 控制器代码。 Laravel 将识别 _method 字段并正确地将请求解释为 PUT 请求。

解释

  1. 带有 _method 字段的 FormData: 通过将 _method: PUT 添加到 FormData, Laravel 可以将 POST 请求解释为 PUT 请求。
  2. 使用 router.post: 您以 POST 而不是 PUT 的形式发送请求。 这避免了 Laravel 无法解析请求正文的问题 当将 PUT 与 multipart/form-data 一起使用时。
  3. Symfony 的限制: 根本问题与 Symfony 有关, Laravel 使用它来处理 HTTP 请求。 Symfony 没有 本机正确解析 PUT/PATCH 请求的多部分/表单数据。 这就是为什么使用带有 _method 覆盖的 POST 是常见的原因 解决方法。

此解决方案应该可以解决 Laravel 显示空请求正文的问题,并允许您成功更新数据。

© www.soinside.com 2019 - 2024. All rights reserved.