Laravel:通过没有表格的AJAX将数据发送到控制器

Ric*_*cky 5 php ajax jquery laravel laravel-5

我需要通过JS在按钮点击时将数据发送到Laravel控制器.我没有使用任何表单,因为数据是动态创建的.每次我尝试发送数据时,我都会收到内部服务器错误(500),但无法在控制器或laravel.log文件中捕获该异常.

这是我正在做的事情:

路线:

Route::post('section/saveContactItems', 'SectionController@saveContactItems');
Run Code Online (Sandbox Code Playgroud)

控制器:

public function saveContactItems($id, $type, $items, $languageID = "PT"){ ... }
Run Code Online (Sandbox Code Playgroud)

JS:

$('button').on("click", function (evt) {

    evt.preventDefault();

    var items = [];
    var id = $("#id").val();
    var languageID = $("#languageID").val();
    var data = { id: id, type: type, items: JSON.stringify(items), languageID: languageID };

    $.ajax({
        url: "/section/saveContactItems",
        type: "POST",
        data: data,
        cache: false,
        contentType: 'application/json; charset=utf-8',
        processData: false,
        success: function (response)
        {
            console.log(response);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我怎么能做到这一点?

更新:感谢@ ShaktiPhartiyal的回答(和@ Sanchit的帮助)我能够解决我的问题.如果其他人遇到类似的问题,在关注@ Shakti的回答后,我无法访问控制器中的数据.所以,我必须在将数据发送到服务器之前对其进行字符串化:

data: JSON.stringify(data),
Run Code Online (Sandbox Code Playgroud)

Sha*_*yal 5

你不需要使用

public function saveContactItems($id, $type, $items, $languageID = "PT"){ ... }
Run Code Online (Sandbox Code Playgroud)

您必须执行以下操作:

public function saveContactItems()
{
    $id = Input::get('id');
    $type = Input::get('type');
    $items = Input::get('items');
    $languageID = Input::get('languageID');
}
Run Code Online (Sandbox Code Playgroud)

是的,因为@Sanchit Gupta建议你需要发送带有请求的CSRF令牌:

在AJAX中发送CSRF令牌的方法:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您使用此方法,则需要设置如下的元标记:

<meta name="csrf-token" content="{{csrf_token()}}">
Run Code Online (Sandbox Code Playgroud)

要么

data: {
        "_token": "{{ csrf_token() }}",
        "id": id
        }
Run Code Online (Sandbox Code Playgroud)

UPDATE

正如@Sanchit Gupta指出的那样使用输入外观如下:

use Input;
Run Code Online (Sandbox Code Playgroud)

  • 在控制器顶部使用"输入"外观 (2认同)
  • 很好解释@ShaktiPhartiyal +1.快乐编码:) (2认同)