2017-07-05 50 views
2

我是laravel框架的新手,並開始遵循laravel任務教程。 我想通過ajax請求傳遞任務的名稱,以便將其保存在數據庫中。laravel ajax請求參數收益爲null

前端:

var taskdata= { 
    "name": $("#new_task").val() 
}; 

//console.log(JSON.stringify(taskdata)); 

$.ajax({ 
    url: '/task', 
    type: 'POST', 
    data: taskdata, 
    contentType: 'json', 
    processData: false, 
    success: function(result) { 
     alert("success"); 
    } 
}); 

服務器端:

Route::post('/task', function (Request $request) { 

    //die(var_dump($request->json("name"))); 

    $validator = Validator::make(json_decode($request->getContent(), true), [ 
     'name' => 'required|max:255', 
    ]); 

    if ($validator->fails()) { 
     return redirect('/') 
      ->withInput() 
      ->withErrors($validator); 
    } 

    $task = new \App\Task; 
    $task->name = $request->name; 
    $task->save(); 

    return redirect('/'); 
}); 
+0

您不能訪問這些值,你會「正常」的形式參數 - 因爲你是發送JSON。你爲什麼首先發送JSON? – CBroe

+0

認爲這將是最好的做法,你建議什麼呢? – user605505

+0

只需發送正常表單數據...?或者實際上使用解碼JSON來訪問數據後得到的結構。 – CBroe

回答

1

下面是解決一個更好的辦法:

Route::post('/task', function (Request $request) { 
    $validator = Validator::make($request->all(), [ 
     'name' => 'required|max:255', 
    ]); 
    if ($validator->fails()) { 
      throw new ValidationException($validator); //Your error handler should send JSON or redirect as appropriate. 
    } 

    $task = new \App\Task; 
    $task->name = $request->name; 
    $task->save(); 

    if ($request->expectsJson()) { 
     return response()->json(true); //Success 
    } else { 
     return redirect()->to("/"); 
    } 
}); 

更新:

你也需要讓jQuery的過程中的數據,以便構建一個適當的查詢:

var taskdata= {"name": $("#new_task").val()}; 
     //console.log(JSON.stringify(taskdata)); 
     $.ajax({ 
      url: '/task', 
      type: 'POST', 
      data: taskdata, 
      contentType: 'json', 
      processData: true, //Or remove it completely since the default is true 
      success: function(result) { 
       alert("success"); 
      } 
     }); 
+0

$ request-> all()仍然返回一個空數組 – user605505

+0

你的'taskdata'的內容將定義控制器的內容。你應該確保(也許通過執行console.log(taskdata))taskdata實際上具有期望的值...如果taskdata被假定爲你期望的名字,你可以只執行'data:{name:taskdata}控制器然後... –

+0

taskdata包含預期值 – user605505

1

當一個AJAX請求期間使用的驗證方法,Laravel不會產生重定向響應。相反,Laravel生成一個包含所有驗證錯誤的JSON響應。此JSON響應將以422 HTTP狀態碼發送。

因此,你可以在你的控制器的方法更改爲

Route::post('/task', function (Request $request) { 

    $validator = Validator::make($request->all(), [ 
     'name' => 'required|max:255', 
    ]); 

    if ($validator->fails()) { 
     return $validator->errors()->all(); 
    } 

    $task = new \App\Task; 
    $task->name = $request->name; 
    $task->save(); 

    return url("/"); 
}); 

和你的Ajax方法

var taskdata= { 
    "name": $("#new_task").val(), 
    "_token" : "{{ csrf_token() }}" 
}; 

$.ajax({ 
    url: '/task', 
    type: 'POST', 
    data: taskdata, 
    contentType: 'json', 
    success: function(result) { 
     console.log(result); // The url 
    }, 
    error: function (data) { 
     console.log(data.responseJSON); // Here you could see the error 
    } 
}); 
+0

我主要關心的是$ request-> all()返回一個空數組 – user605505

+0

按照@apokryfos的建議,你可以刪除'processData:false,'或設置'processData:true,' – linktoahref

+0

如果驗證器失敗,您應該返回一個帶有錯誤http代碼的響應,例如'return response() - > json($ validator-> errors() - > all(),422)'。這是你可以運行'error'函數的唯一方法。 – apokryfos