Laravel 5:在路由中获取 ajax 数据并传递给控制器

Posted

技术标签:

【中文标题】Laravel 5:在路由中获取 ajax 数据并传递给控制器【英文标题】:Laravel 5: Fetch ajax data in route and pass to controller 【发布时间】:2016-11-25 03:15:33 【问题描述】:

我正在使用 Laravel 5 并希望使用一些数据对控制器进行 ajax 调用:

 $.ajax(
    url : "/getOrgById",
    data : JSON.stringify(id:1)
)

routes.php 有:

Route::get('/getOrgById', 'HomeController@getOrgById');

HomeController.php:

public function getOrgById($data) 
   //code here fails with message 'Missing argument 1 for HomeController::getOrgById()

如何将数据从 ajax 传递到路由,然后再传递到控制器?

【问题讨论】:

看起来你正在接近一些类似 CRUD 的结构;我建议您创建一个单独的控制器并将其注册到 Route::resource('organizations', 'OrganizationsController') 并添加一个 show($id) 方法。这将允许您开箱即用地执行/organizations/1。如果你坚持要通过查询参数来获取数据,只需将$datagetOrgById方法中去掉,然后用Request::get('id')访问id即可。 【参考方案1】:

我认为下面的例子就是你要找的

路线

Route::post('/getOrgById', 'HomeController@getOrgById');

控制器

public function getOrgById(Request $request) 
    $id = $request->input('id');

JS

var myJsonData = id: 1
$.post('/getOrgById', myJsonData, function(response) 
    //handle response
)

【讨论】:

【参考方案2】:

您应该真正研究足智多谋的控制器操作。如果您想通过其 ID 获取组织,那么您有一个组织实体,因此创建一个相应的组织控制器。然后,此控制器可以有一个方法通过其主键值显示一个组织:

class OrganisationController

    public function show($id)
    
        return Organisation::findOrFail($id);
    

这个路线看起来像:

Route::get('/organisations/id', 'OrganisationController@show');

然后您可以像这样通过 AJAX 请求此路由:

$.ajax(
    method: 'GET',
    url: '/organisations/' + id
);

【讨论】:

【参考方案3】:

您可以使用Input 来获取您的变量

public function getOrgById() 
     $data = \Input::get('data')

【讨论】:

【参考方案4】:

您可以在路由中定义参数:

Route::get('/getOrgById/id', 'HomeController@getOrgById');

然后调用它:

$.ajax(
    url : "/getOrgById" + id
)

【讨论】:

在我只有一个变量的例子中你是对的。但是如果我想传递一个复杂的 json 呢? 您可以使用Input::get() 检索您的数据 我认为您在 getOrgById 之后忘记了一个“/”。【参考方案5】:

您几乎是对的,但是在您的函数声明中使用$data 时,您实际上需要一个查询字符串变量,而不是一个表单请求。

您必须在 Controller 方法中添加表单请求,如下所示:

public function getOrgById(Request $request)
    // do something here...
    return response()->json(array('foo' => 'bar'));

【讨论】:

作为该功能的演示,仅此而已。当表单验证失败时,我也会返回 422,使用 JSON。 返回 422 以用于验证失败。鉴于 Stack Overflow 的复制粘贴性质,您应该在成功请求上设置类似 422 状态代码的内容作为该功能的“演示”。这是不正确的,也与OP提出的问题无关。 这是一种我们都可以接受的技术。最后,我会帮助 OP,让他/她现在有多种选择。 代码中有“选择”无处不在,但展示了状态码(与问题无关)并展示了错误在这种情况下,这是鲁莽的,并且由于 Stack Overflow 答案的“复制粘贴”性质,弊大于利。以后请多加注意。因此,我不得不编辑您的答案。【参考方案6】:

试试这个,

HTML 表单

<div id="loadingResponse"></div>
!!Form::open(array('url'=>'test/submit', 'id'=>'submitForm','method'=>'POST'))!!
    Form::token()
    <input type="text" name="data"/>
    <button type="submit" class="btn btn-small btn-info">Send Data</button>
Form::close()

JS Ajax

$("#submitForm").submit(function(event) 
    event.preventDefault();
    $.ajax(
        url         : 'test/submit',
        data        : new FormData($("#submitForm")[0]),
        dataType    : 'JSON',
        type        : 'POST',
        beforeSend: function()
            $("#loadingResponse").html("<img src='asset('img/loading.gif')' />");
        ,
        success: function(response)
            console.log(response);
        ,
        error: function (xhr, ajaxOptions, thrownError) 
            console.log('Error '+xhr.status+' | '+thrownError);
        ,
    );
);

PHP 路由

...
Route::post("test/submit","TestController@submit");
...

PHP 控制器

class TestController extends Controller

    ...
    public function submit(Request $request)
    
        response()->json(['msj' => $request->input('data')]);
    
    ...

【讨论】:

【参考方案7】:

ajax:

$.ajax(
    type:'get',
    url:'/getOrgById',
    data:
        id:1
    ,
    success:function(res)
    

);

routes.php:

Route::get('/getOrgById', 'HomeController@getOrgById');

HomeController.php:

public function getOrgById(Request $request) 
    dd($request);

【讨论】:

以上是关于Laravel 5:在路由中获取 ajax 数据并传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 Ajax 调用中传递完整 URL 作为参数 - Laravel 5.1 路由

如何在 AJAX 调用中获取 JavaScript 变量作为 Laravel 路由名称

如何从控制器获取记录到 Ajax laravel 5.2

laravel 5 简单的 ajax 从数据库中检索记录

laravel 5 和 Ajax 从数据库中获取数据:

JavaScript 表单使用 Ajax 和 Laravel 路由提交到数据库