我正在尝试解析从ajax表单发送的数据。但由于某种原因,我无法从php控制器中的表单中提取信息。这就是我正在做的事情。
这是html:
<p>
这是javascript ajax处理:
<div style="margin-top: 100px;">
<h2>Character settings</h2>
<table class="table table-striped table-bordered table-hover">
<tr>
<th>Name</th>
<th>Map</th>
<th>Move</th>
</tr>
@foreach($chars as $char)
<tr>
<td>{{$char['name']}}</td>
<td>{{$char['map']}}</td>
<td>
{{Form::open(array('action' => 'UsersController@move', 'class' => 'mover'))}}
<input type="hidden" name="charID" class="charID" value="{{$char['id']}}" />
<button type="submit" class="btn btn-small btn-info">Move</button>
{{Form::close()}}
</td>
</tr>
@endforeach
</table>
这是控制器:
$('#mover').on('submit', function(e){
e.preventDefault();
var $form = $( this ),
method = $form.attr( "method" );
$.ajax({
url: "{{action('UsersController@move')}}",
dataType: "json",
data: $form.find('.charID').val(),
type: method,
success: function (response) {
console.log(reponse['test']);
}
});
});
当我检查控制台登录提交时,我看到数据“charID”,因此它被表单正确提取,但我似乎无法在laravel控制器中获取它。奇怪的是我在控制器的其他部分使用Input :: get()函数。所以这就是这个功能。
任何帮助表示赞赏!
答案 0 :(得分:2)
您正在访问response[test]
而不是response[text]
。
其他注意事项:
您对exit();
的使用是多余的,永远不会被击中,因为您return
高于它。
此外,exit
是一种语言结构,如果没有传递状态,则可以在没有parens的情况下调用它。因此,如果您要在没有参数的情况下使用它,只需使用exit;
。
您的ajax方法可以进行一些优化,看起来您的数据也存在另一个问题,需要将其作为键值对发送。
您可以将其作为GET请求形式的内联字符串,或{ "charID": $(this).find("input[name=charID]").val() },
之类的对象。
$("#mover").on("submit", function (e) {
e.preventDefault();
$.ajax({
"url": this.action, // <-- we can use native javascript
"dataType": "json",
"data": $(this).serialize(), // <-- collects your form data
"type": this.method,
"success": function (data) {
if (data.success !== "undefined" && data.success === 200) {
console.log(data.text);
}
}
});
});
我建议不要使用Form
助手类。它事后并不是非常易读。与编写HTML表单定义相比,使用它不会节省那么多时间。
让我们优化您的控制器,以便更容易理解:
public function move ()
{
if (Auth::check()) {
Log::info(($charID = request('charID')));
$person = Character::where('id', '=', $charID)->first();
$person->map = 100000000;
$person->save();
return response()->json([
'success' => 200, // success
'text' => 'Your character has been moved!'
]);
} else {
return response()->json([
'success' => 401 // unauthorised
]);
}
}
对于您不止一次访问的变量,我使用parens ()
的巧妙技巧。如果你在一个parens中包含一个作业,例如($charID = request('charID'))
您仍然可以在线使用它的输出,并且您现在可以在脚本中进一步访问它。[/ p>
我选择了request()
和redirect()
之类的辅助方法,而不是他们的类对应方式,array()
的使用有点老了 - 但这只是我的看法 - 我'使用方括号[]
。
当用户未经过身份验证时,您的响应在此处无用,假设此控制器操作仅用于处理来自AJAX请求的帖子(如果我没有记错的话)。因为它无法强制您的异步请求重定向您。相反,我们返回正确的HTTP response code 401来表示用户未经授权。
您还可以查找代码结构的PSR-2标准,因为这是目前用作行业标准的标准。
最后,如果您在此处使用控制器上的Web中间件(具有CSRF保护)。您需要发送带有请求的CSRF令牌。您可以通过将{{ csrf_field() }}
弹出到表单中来实现。表单助手可能正在为您执行此操作。
但是,如果你在AJAX设置中没有使用$(this).serialize()
,你可能会遇到的另一个问题是,_token
字段永远不会随请求一起发送。
答案 1 :(得分:1)
尝试
data: { 'charID': $form.find('.charID').val() },
因为现在你只发送了这个价值,所以PHP
无法让Laravel
知道它的名字
答案 2 :(得分:0)
尝试更改如下,
$.ajax({
url: "{{action('UsersController@move')}}",
dataType: "json",
data: $form.serialize(),
type: 'post',
success: function (response) {
console.log(reponse['test']);
}
});
答案 3 :(得分:0)
我发现此代码存在一些潜在问题。
您正在使用'class'=&gt;初始化表单'mover',但是你的jquery正在寻找$('#mover') - 所以你的表单标签有“mover”类,但是你的jquery期望id'mover'
您将ajax方法设置为$ form.attr(“method”);但是我不确定你的表单标签中是否设置了方法?为什么不将你的ajax类型/方法设置为POST,因为这是发布表单的适当方法?