我在尝试使用 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惯性是否需要任何额外的配置?
解决方法包括将请求方法更改为 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 请求。
解释
此解决方案应该可以解决 Laravel 显示空请求正文的问题,并允许您成功更新数据。