【问题标题】:unable to retrieve data sent via ajax in controller Laravel 5.1无法在控制器 Laravel 5.1 中检索通过 ajax 发送的数据
【发布时间】:2015-08-31 19:49:36
【问题描述】:

我通过 ajax 向我的控制器发送数据

$.ajax({
    url: 'test',
    type: 'POST',
    data: { id: sessionStorage.getItem('user_id') },
    dataType: 'json',
    contentType: "application/json; charset=utf-8"/*,
    success:function(id){
    alert(sessionStorage.getItem('user_id'));
}*/
});

在我使用的控制器中

public function getUserMessages(){

        $id = Input::get('id');
        $messages = Message::where('message_by' , Auth::user()->id)->where('message_for',$id)->get();
        echo "id is ",$id;
        return $messages;
    }

我在$id 中一无所获。我也试过$_POST['id'],上面写着undefined index id。如何检索 id 值? $request->has('id') 也返回 false。

【问题讨论】:

  • 这是一个愚蠢的问题 -> 你在获取之前设置了 user_id 吗?
  • 是的,我仔细检查过。在发送之前设置值,我也可以看到正在发送的值。 link

标签: javascript php ajax controller laravel-5.1


【解决方案1】:

您应该使用Request 类而不是Input

public function getUserMessages(\Illuminate\Http\Request $request){

        $id = $request->id;
        $messages = Message::where('message_by' , Auth::user()->id)->where('message_for',$id)->get();

        return $messages;
    }

您的 ajax 调用不起作用并且会抛出 500 服务器错误,因为您需要在发布内容时传递 laravel 的 csrf 令牌。在刀片视图的顶部创建一个元标记,例如:

<meta name="_token_" content="{{ csrf_token() }}">

并在进行 ajax 调用时获取值:

$.ajax({
    url: '/test',
    type: 'POST',
    data: { 
        id: sessionStorage.getItem('user_id'),
        _token:document.getElementsByName('_token_')[0].getAttribute('content') 
    },
    success:function(id){
    alert(id);
}
});

您的 ajax 调用中的成功函数很可能只会提醒 [object Object],为了更好地了解返回的内容,请使用

console.log(id);

相反。

您还可以为 ajax 调用创建一个错误函数,以便显示可能的错误。只需添加

error: function(err){
    console.log(err);
}

成功后的功能。

【讨论】:

  • 我的主模板标头中有&lt;meta name="_token_" content="{{ csrf_token() }}"&gt;,因此正在发送请求和数据。我可以在 chrome link 中看到数据。但问题是我在视图中注入了这个控制器并调用了函数,所以我也必须在那里传递Illuminate\Http\Request 实例。我该怎么做?
  • 对不起,我不明白你的意思。如果这就是您的意思,您可以毫无问题地在您的所有控制器方法中注入 Request 类。 @亚当尼克
  • 我像这样注入 @inject('request','Illuminate\Http\Request') 并将 $request 传递给我的函数调用。但不幸的是仍然没有得到价值。
  • 你为什么要这样做?我不会将控制器注入到视图中。如果您需要视图中来自控制器的数据,请改用return view('View')-&gt;with(['foo' =&gt; $foo]);
  • 我不想返回视图,因为我需要数据的视图是聊天框的一部分。
【解决方案2】:

问题是你将应用内容设置为json,你不需要设置内容。

jQuery ajax

contentType(默认:'application/x-www-form-urlencoded; charset=UTF-8')

$.ajax({
    url: 'test',
    type: 'POST',
    data: { id: sessionStorage.getItem('user_id') },
    dataType: 'json',

    success:function(data){
         console.log(data); // always good to output content for debugginn
    }
});

希望对您有所帮助。你的 ajax 现在应该可以工作了。

【讨论】:

  • 我还必须删除dataType。但是我的 ajax 请求只有在我禁用路由上的 csrf 保护后才有效。否则我总是得到500 internal server error
  • @Adamnick 将其添加到您的脚本中,如果您没有它$.ajaxSetup({ headers : { 'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content') } });
  • @Adamnick 感谢您接受答案。祝你好运。
  • 我有它,但这一直触发错误,我现在厌倦了它。 :/ 一个额外的问题,我可以从控制器返回部分视图吗?
【解决方案3】:

您有 AJAX 请求的路由吗? (我没看到。)

请尝试以下代码:

在您的 AJAX 代码中:

$.ajax({
    type: "POST",
    url: "{{ route('ajax_route') }}",
    data: { _token:  "{{ csrf_token() }}", data: "sample data" },
    success: function(data){
        $(".result").html(data);
    },
    dataType: "json"
});

在您的控制器代码中:

public function ajaxAction(Request $request){
  if ($request->isXmlHttpRequest() && $request->isMethod('post')) {
    $data = $request->input('data', null);
    echo json_encode($data);
  }
}

在您的路线代码中:

Route::post('/ajax_route', ['as' => 'ajax-action', 'uses' => 'YourController@ajaxAction']);

【讨论】:

  • @Nathaniel Ford;感谢您的纠正对不起我的英语不好:)
  • 不用担心:这就是为什么会有帮助、改进和编辑队列的原因。
猜你喜欢
  • 2017-08-30
  • 2017-06-23
  • 1970-01-01
  • 2013-04-13
  • 2020-09-24
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多