无法在控制器 Laravel 5.1 中检索通过 ajax 发送的数据

Posted

技术标签:

【中文标题】无法在控制器 Laravel 5.1 中检索通过 ajax 发送的数据【英文标题】:unable to retrieve data sent via ajax in controller Laravel 5.1 【发布时间】: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 【参考方案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;感谢您的纠正对不起我的英语不好:) 不用担心:这就是为什么会有帮助、改进和编辑队列的原因。

以上是关于无法在控制器 Laravel 5.1 中检索通过 ajax 发送的数据的主要内容,如果未能解决你的问题,请参考以下文章

如果在 laravel 5.1 中未授权操作,则通过 ajax 显示错误

如何在 Laravel 5.1 中从 Blade 调用控制器动作?

Laravel 5.1通过急切加载返回连接字段

PHP Laravel:Ajax 无法检索数据(无属性)

Laravel 5.1 SSH - 无法连接到远程服务器

Laravel 5.1 - 表单中的 Foreach 数据(刀片)