为什么我不能使用ajax和laravel获取表单输入

时间:2016-06-24 20:35:15

标签: php jquery ajax laravel

我正在尝试解析从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()函数。所以这就是这个功能。

任何帮助表示赞赏!

4 个答案:

答案 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)

我发现此代码存在一些潜在问题。

  1. 您正在使用'class'=&gt;初始化表单'mover',但是你的jquery正在寻找$('#mover') - 所以你的表单标签有“mover”类,但是你的jquery期望id'mover'

  2. 您将ajax方法设置为$ form.attr(“method”);但是我不确定你的表单标签中是否设置了方法?为什么不将你的ajax类型/方法设置为POST,因为这是发布表单的适当方法?