无法在控制器 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);
成功后的功能。
【讨论】:
我的主模板标头中有<meta name="_token_" content=" csrf_token() ">
,因此正在发送请求和数据。我可以在 chrome link 中看到数据。但问题是我在视图中注入了这个控制器并调用了函数,所以我也必须在那里传递Illuminate\Http\Request
实例。我该怎么做?
对不起,我不明白你的意思。如果这就是您的意思,您可以毫无问题地在您的所有控制器方法中注入 Request
类。 @亚当尼克
我像这样注入 @inject('request','Illuminate\Http\Request')
并将 $request 传递给我的函数调用。但不幸的是仍然没有得到价值。
你为什么要这样做?我不会将控制器注入到视图中。如果您需要视图中来自控制器的数据,请改用return view('View')->with(['foo' => $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 显示错误