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

Laravel中Ajax请求数据在控制器为空问题求助

问题排查与解决方案

问题原因

你在AJAX请求中错误配置了processData: false和contentType: false,这两个参数仅适用于上传文件或使用FormData对象的场景。当传递普通键值对数据时,这两个设置会阻止jQuery自动将数据编码为标准的application/x-www-form-urlencoded格式,导致Laravel无法解析POST请求体,最终控制器中的Request对象为空。

解决方案

移除AJAX配置中的processData和contentType参数(jQuery默认会自动处理这两项),同时确保CSRF令牌正确包含在请求数据中(即使你排除了令牌问题,显式携带可避免潜在异常)。

修正后的AJAX代码

$(document).on('click', '#status_update', function(e) {
    if ($(this).prop('checked')) {
        $(this).addClass('bg-primary border-2');
    } else {
        $(this).removeClass('bg-primary');
    }
    var data = {
        _token: "{{ csrf_token() }}", // 显式携带CSRF令牌
        id: $(this).data('id'),
        status: $(this).prop('checked') ? 1 : 0,
    };
    var url = "{{ route('changeFirmwareStatus') }}";
    $.ajax({
        type: "POST",
        url: url,
        data: data,
        dataType: "json",
        success: function(response) {
            toastr.options = {
                "closeButton": true,
                "progressBar": true,
                "showDuration": 300,
                "timeOut": 2000,
                "hideDuration": 1000,
                // "preventDuplicates": true,
            }
            toastr[response.state](response.message);
        }
    });
});

控制器代码优化(可选)

添加请求验证确保数据合法性,同时简化逻辑:

public function changeFirmwareStatus(Request $request)
{
    // 验证请求参数
    $validated = $request->validate([
        'id' => 'required|integer|exists:firmwares,id',
        'status' => 'required|boolean',
    ]);

    Firmware::findOrFail($validated['id'])->update(['status' => $validated['status']]);

    return $this->JsonResponse(200, 'success', 'Firmware Status Successfully Changed !');
}

内容的提问来源于stack exchange,提问作者Muhammad Kamran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:29