【问题标题】:Laravel 5: Fetch ajax data in route and pass to controllerLaravel 5:在路由中获取 ajax 数据并传递给控制器
【发布时间】: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。如果你坚持要通过查询参数来获取数据,只需将$data从getOrgById方法中去掉,然后用Request::get('id')访问id即可。

标签: php ajax laravel laravel-5


【解决方案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);
          }
          

          【讨论】:

            猜你喜欢
            • 2017-01-12
            • 2016-03-25
            • 2016-05-16
            • 1970-01-01
            • 2015-01-06
            • 1970-01-01
            • 2012-09-20
            • 1970-01-01
            相关资源
            最近更新 更多