如何通过 post 方法将数据从 ajax 传递到 laravel 5.2 控制器

Posted

技术标签:

【中文标题】如何通过 post 方法将数据从 ajax 传递到 laravel 5.2 控制器【英文标题】:How to pass data from ajax to laravel 5.2 controller via post method 【发布时间】:2016-07-09 20:37:16 【问题描述】:

你好 *** 家族。这是我的第一个问题,希望能得到帮助。

我是 laravel 框架的新手,我的项目中使用的是 5.2 版。 我正在尝试使用 post 方法将数据从我的 ajax 函数传递到特定的控制器方法,但没有数据传递到控制器。

我按照此论坛https://laracasts.com/discuss/channels/laravel/process-data-in-controller-using-ajax-in-laravel 中的步骤操作,但无法正常工作。这是我到目前为止所做的。

我的 javascript (post_script.js):

$.ajax(
    method: 'POST',
    url: './home',
    data: 
        userID: 76,
        userName: 'Jimmy'
     ,
);

注意,这个文件保存在 laravel 结构中的assets/js 目录下。这是我在路由文件中的内容 (routes.php):

Route::get('/', "MyController@home");
Route::get('home', "MyController@home");

这是我在MyController.php 文件中的功能:

function home(Request $request) 
    $userID = $request['userID'];
    $userName = $request['userName'];
    return view('home', [
      'userID'=> $userID,
      'userName' => $userName
    ]);

在我看来,我尝试这样访问它:

<p>User ID: $userID</p>
<p>User Name: $username</p>

什么都没有显示!请问我做错了什么?我需要你的帮助。如果我的问题不恰当,请原谅我,但我希望你明白我的意思。谢谢

【问题讨论】:

您是否能够确认数据确实已发布到所需的路线?例如,在您的浏览器控制台中,您在发布数据时会获得哪个 HTTP 响应代码?您是否尝试过将$request 的内容直接转储到您的控制器中? 【参考方案1】:

您的 AJAX 正在 POST,但您没有设置 POST 路由,只有 GET。添加 POST 路由,如下所示:

Route::post('home', "MyController@home");

【讨论】:

【参考方案2】:

首先使用您的开发人员/网络工具(例如 firebug)检查您的 ajax 调用是否到达所需的控制器/函数以及参数是否正确转发。

在 Laravel 环境中的 ajax 调用中指定 Url 的一种安全方法是使用 URL 外观,如下所示:

url: " URL::to('home'); ",

但是,为了这样做,您必须将您的 js 存储为 myscript.blade.php (!!) 文件并相应地@include 到您的视图中。

为了在控制器函数中接收您发布的参数,无需声明函数参数,您可以简单地使用 Input::Get() 函数,例如。像这样:

public function home()

  $userID = Input::Get('userID');
  $userName = Input::Get('userName');
  return view('home', [ 'userID'=> $userID, 'userName' => $userName ]);

【讨论】:

【参考方案3】:

如果您尝试执行 POST 请求,您可能需要X-CSRF-Token

将此添加到元:

<meta name="csrf-token" content=" csrf_token() ">

并设置您的 AJAX:

$.ajaxSetup(
    headers: 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    
);

在 Laravel 文档中:https://laravel.com/docs/5.2/routing#csrf-x-csrf-token

【讨论】:

【参考方案4】:

首先你需要为这样的 ajax 请求设置 dataType(如果你使用 jQuery)

 $.ajax(
    method: 'POST',
    url: './home',
    dataType: 'json'
    data: 
        userID: 76,
        userName: 'Jimmy'
     ,
)

然后尝试按如下方式使用到您的控制器中

Request::json()

看看结果

你也可以使用 Input::get() :

Request::get('userID')

【讨论】:

【参考方案5】:

您可以使用路由名称将数据传递给控制器​​

 $.ajaxSetup(
            headers:'X-CSRF-TOKEN': $("meta[name='csrf-token']").attr('content')
        );
        $.ajax(
            type:'POST',
            url: 'route("route_name_with_post_method")',
            data:
              'id': data
            ,
            success:function(r)

            ,error:function(r) 

            
        );

【讨论】:

以上是关于如何通过 post 方法将数据从 ajax 传递到 laravel 5.2 控制器的主要内容,如果未能解决你的问题,请参考以下文章

将数据数组从表单传递到 ajax 到 PHP 发布文件

如何将图像文件和表单数据从 Ajax 传递到 MVC 控制器

将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败

如何使用 AJAX 将数据从视图传递到控制器

确保控制器方法实际上是由 ajax 或 mvc 中的 POST 请求调用的

将多个参数从 ajax post 传递到 asp.net mvc 控制器