我刚到拉拉威尔。
我想把ajax调用中的两个变量传递给类中的一个方法。
我的ajax调用(来自各种谷歌搜索)是:
var token = $('meta[name="csrf-token"]').attr('content');
var inputValue = "Testing";
var anotherInput = "Testing2";
var data = {};
data.anotherInput = anotherInput;
data.inputValue = inputValue;
data._method = 'POST';
data._token = token;
//data: JSON.stringify(data),
$.ajax({
url: postUrl,
type: 'POST',
headers: {
'X-CSRF-TOKEN': token
},
data: JSON.stringify(data),
dataType: 'json',
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
processData: false,
success:function(response)
{
console.log(response);
},
error: function(response) {
console.log(response);
}
});
变量"postUrl"是在我的layout.blade.php中设置的:
<script>
var postUrl = "{{ route('filepathtest') }}";
</script>
我的Controller类的顶部是:
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
// use Request;
use Illuminate\Support\Facades\Input;
use Illuminate\Http\Response;
use App\Models\MainSettings;
use App\Http\Requests\MainSettingsRequest;
class MainSettingsController extends Controller
{
private string $messageTitle = "";
private $messageText = array();
/**
* Corrects path and checks it points to something.
*/
public function filePathTest(Request $request)
{
$data = $request->all();
$response = array(
'msg' => $data,
);
return response()->json($response);
}
最后,我的路线是:
Route::match(array('GET','POST'),'filepathtest', [MainSettingsController::class, 'filePathTest'])->name('filepathtest');
我的响应被记录到Console.Log中,我看到以下内容:
我已经尝试了很多方法从控制器访问变量,但没有效果?我已经尝试:
$data = $request->input('anotherInput');
以及:
$data = $request->anotherInput;
以及:
$data = $request['anotherInput'];
以及:
$data = $request->post('anotherInput');
以及:
$data = $request->request('anotherInput');
但它们似乎都返回null,除了最后一个给我一个错误(除非我只是"使用Request;"而不是"使用Illuminate\Http\Request;")?
1条答案
按热度按时间nnvyjq4y1#
这似乎是
$.ajax()
请求的一个综合因素,至少,这应该适用于POST
请求:在这种情况下,有几个问题:
data: JSON.stringify(data)
在本例中,您将
data
对象编码为单个String,并将其发送到控制器。$request->all()
使用该JSON字符串作为Array索引,因此在通过\Log::info($request->all());
进行日志记录时会出现奇怪的['{"anotherInput":"Testing2", ...}' => null]
输出这应该只是
data: data
,或者使用JS对象简写甚至只是data
。processData: false
我不熟悉这个设置,但是您可以查看
$.ajax()
文档,看看什么时候适合使用这个设置:https://api.jquery.com/jquery.ajax/dataType
、contentType
和headers
这里本身没有任何错误,但是在发出
AJAX
请求时,请检查是否确实需要这些密钥。如果数据中包含_input
密钥,您可能可以忽略headers
,但我怀疑发送两次会造成伤害。因此,总而言之,代码在重构为以下代码时应该能够正常工作:
在后端,
$request->all()
应该根据发送的数据返回一个包含4个索引的数组,并且$request->input(...)
应该返回其中任何一个索引的值,如果指定的索引无效,则返回null
。