部署的 Laravel 应用无法处理通过 Ajax 传递给控制器的变量
Deployed Laravel app can't handle variables passed to controller via Ajax
我在我的本地环境中创建了一个 Laravel 应用程序,它工作得很好。当我将它部署到 VPS 服务器时,为了在线访问它,由于某种原因,我的 AJAX 停止工作 .这是一个非常简单的 AJAX 函数示例,它在本地工作,但 在我的服务器中不工作。
观点:
<html>
<head>
<title>Ajax Example</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js">
</script>
<script>
function getMessage() {
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: 'GET',
url: '/getmsg',
data: {
greeting: 'Hello'
},
success: function (data) {
$("#msg").html(data.msg);
}
});
}
</script>
</head>
<body>
<div id='msg'>This message will be replaced using Ajax.
Click the button to replace the message.
</div>
<?php
echo Form::button('Replace Message', ['onClick' => 'getMessage()']);
?>
</body>
</html>
控制器:
class TestAjaxController extends Controller {
public function index(Request $request) {
return response()->json(array('msg'=> $request->greeting), 200);
}
}
路线:
//Test routes
Route::get('ajax-test',function() {
return view('ajax-test');
});
Route::get('/getmsg','TestAjaxController@index');
所有这个功能所做的,是通过点击一个按钮,它向控制器发送一个定义的变量,然后控制器 returns 向视图发送一个带有相同消息的响应,然后 Jquery 改变消息的文本。
问题是按下按钮时没有数据被传递给控制器,所以控制器returns空数组.
注意:我的本地环境使用 Apache (XAMPP),但我的 VPS 使用 NGINX。虽然我怀疑这是这里的问题。
我完全不知道哪里出了问题。也许我的 VPS 安装或类似的东西中缺少一些 PHP 模块?
您实际上是在访问表单域。直接来自文档
Retrieving Input Via Dynamic Properties
您还可以使用 Illuminate\Http\Request 实例上的动态属性访问用户输入。例如,如果您的应用程序的一个表单包含一个 name 字段,您可以像这样访问该字段的值:
$name = $request->name;
使用动态属性时,Laravel 将首先在请求负载中查找参数值。如果不存在,Laravel 将在路由参数中搜索该字段。
所以尝试使用 $request->query('name')
例如 TestAjaxController
应该是
class TestAjaxController extends Controller {
public function index(Request $request) {
return response()->json(array('msg'=> $request->query('greeting')), 200);
}
}
我没有测试,但应该可以。希望这会对你有所帮助:)
所以出于某种原因我只需要使用 POST
方法。我不知道为什么一切都在本地使用 GET
,但在生产服务器上我不得不使用 POST
。
这是工作代码:
查看:
<script>
function getMessage() {
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: 'POST',
url: '/getmsg',
data: {
greeting: 'Hello'
},
success: function (data) {
$("#msg").html(data.msg);
}
});
}
</script>
路线:
Route::get('ajax-test',function() {
return view('ajax-test');
});
Route::post('/getmsg','TestAjaxController@index');
我在我的本地环境中创建了一个 Laravel 应用程序,它工作得很好。当我将它部署到 VPS 服务器时,为了在线访问它,由于某种原因,我的 AJAX 停止工作 .这是一个非常简单的 AJAX 函数示例,它在本地工作,但 在我的服务器中不工作。
观点:
<html>
<head>
<title>Ajax Example</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js">
</script>
<script>
function getMessage() {
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: 'GET',
url: '/getmsg',
data: {
greeting: 'Hello'
},
success: function (data) {
$("#msg").html(data.msg);
}
});
}
</script>
</head>
<body>
<div id='msg'>This message will be replaced using Ajax.
Click the button to replace the message.
</div>
<?php
echo Form::button('Replace Message', ['onClick' => 'getMessage()']);
?>
</body>
</html>
控制器:
class TestAjaxController extends Controller {
public function index(Request $request) {
return response()->json(array('msg'=> $request->greeting), 200);
}
}
路线:
//Test routes
Route::get('ajax-test',function() {
return view('ajax-test');
});
Route::get('/getmsg','TestAjaxController@index');
所有这个功能所做的,是通过点击一个按钮,它向控制器发送一个定义的变量,然后控制器 returns 向视图发送一个带有相同消息的响应,然后 Jquery 改变消息的文本。
问题是按下按钮时没有数据被传递给控制器,所以控制器returns空数组.
注意:我的本地环境使用 Apache (XAMPP),但我的 VPS 使用 NGINX。虽然我怀疑这是这里的问题。
我完全不知道哪里出了问题。也许我的 VPS 安装或类似的东西中缺少一些 PHP 模块?
您实际上是在访问表单域。直接来自文档
Retrieving Input Via Dynamic Properties
您还可以使用 Illuminate\Http\Request 实例上的动态属性访问用户输入。例如,如果您的应用程序的一个表单包含一个 name 字段,您可以像这样访问该字段的值:
$name = $request->name;
使用动态属性时,Laravel 将首先在请求负载中查找参数值。如果不存在,Laravel 将在路由参数中搜索该字段。
所以尝试使用 $request->query('name')
例如 TestAjaxController
应该是
class TestAjaxController extends Controller {
public function index(Request $request) {
return response()->json(array('msg'=> $request->query('greeting')), 200);
}
}
我没有测试,但应该可以。希望这会对你有所帮助:)
所以出于某种原因我只需要使用 POST
方法。我不知道为什么一切都在本地使用 GET
,但在生产服务器上我不得不使用 POST
。
这是工作代码: 查看:
<script>
function getMessage() {
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: 'POST',
url: '/getmsg',
data: {
greeting: 'Hello'
},
success: function (data) {
$("#msg").html(data.msg);
}
});
}
</script>
路线:
Route::get('ajax-test',function() {
return view('ajax-test');
});
Route::post('/getmsg','TestAjaxController@index');