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
。如果你坚持要通过查询参数来获取数据,只需将$data
从getOrgById
方法中去掉,然后用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 路由