2017-07-05 48 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