Javascript 对控制器的laravelajax调用
我对Javascript 对控制器的laravelajax调用,javascript,php,ajax,laravel,controller,Javascript,Php,Ajax,Laravel,Controller,我对Laravel非常陌生,在访问控制器中的特定方法时遇到问题。我正在尝试根据下拉菜单更改数据库值(语言) 设置.配置文件.刀片 <select id="accountLanguage" class="form-control" method="GET"> <option value="en" {{ ($strLanguage == 'en') ? 'selected = "selected"' : "" }} >English</option>
Laravel
非常陌生,在访问控制器中的特定方法时遇到问题。我正在尝试根据下拉菜单更改数据库值(语言)
设置.配置文件.刀片
<select id="accountLanguage" class="form-control" method="GET">
<option value="en" {{ ($strLanguage == 'en') ? 'selected = "selected"' : "" }} >English</option>
<option value="es" {{ ($strLanguage == 'es') ? 'selected = "selected"' : "" }} >Español</option>
<option value="he" {{ ($strLanguage == 'fr') ? 'selected = "selected"' : "" }} >French</option>
</select>
Route::namespace( 'Settings' )->prefix( 'settings' )->group( function () {
...
// PROFILE
Route::resource( 'profile', 'ProfileController', ['only' => ['index','update']] );
Route::get('test', 'ProfileController@update');
});
路线
<select id="accountLanguage" class="form-control" method="GET">
<option value="en" {{ ($strLanguage == 'en') ? 'selected = "selected"' : "" }} >English</option>
<option value="es" {{ ($strLanguage == 'es') ? 'selected = "selected"' : "" }} >Español</option>
<option value="he" {{ ($strLanguage == 'fr') ? 'selected = "selected"' : "" }} >French</option>
</select>
Route::namespace( 'Settings' )->prefix( 'settings' )->group( function () {
...
// PROFILE
Route::resource( 'profile', 'ProfileController', ['only' => ['index','update']] );
Route::get('test', 'ProfileController@update');
});
settings.profile.js
function initProfileManager() {
// GET ELEMENTS
var domUpdateLanguage = $('#accountLanguage');
var updateLanguage = function() {
// MAKE AJAX CALL
$.ajaxq( {
// url:'/settings/profile',
url:'./test',
method:'GET',
success: function( bolUpdated ) {
if( bolUpdated ) {
alert('OK');
}
},
fail: function() {
alert('NO');
}
});
location.reload();
};
domUpdateLanguage.on( 'change', updateLanguage );
按照当前的方式,我得到了以下错误函数App\Http\Controllers\Settings\ProfileController::update()的参数太少,传递了0个,预期正好是1个
。我理解这个错误,但不知道如何传递这个论点
如果我从JS
中取消对url
行的注释,我就永远不会进入update
方法,我只会运行index
两次
任何帮助都将不胜感激
编辑1
奇怪。我试图定义一个随机值,但它仍然会给我那个错误。我认为你可能是对的,这是一个语法问题。但我不明白为什么会这样
function initProfileManage(strLang) {
// GET ELEMENTS
var domUpdateLanguage = $('#accountLanguage');
var updateLanguage = function() {
// MAKE AJAX CALL
$.ajaxq({
// url:'/settings/profile',
url:'./test',
method:'POST',
data: {
strLang: newLang,
}
success: function( bolUpdated ) {
if( bolUpdated ) {
alert('OK');
}
},
fail: function() {
alert('NO');
}
});
location.reload();
};
// UPATE LANGUAGE EVENT
domUpdateLanguage.on( 'change', updateLanguage );
}
将路线更改为:
Route::post('test', 'ProfileController@update');
以及您的ajax对象:
method:'POST',
实际上,您也必须以某种方式传递$strLang(因为update()方法需要这样做,正如错误消息所述)
哦,而且在select HTML中确实不需要method属性;) 将您的路线更改为:
Route::post('test', 'ProfileController@update');
以及您的ajax对象:
method:'POST',
实际上,您也必须以某种方式传递$strLang(因为update()方法需要这样做,正如错误消息所述)
哦,而且在select HTML中确实不需要method属性;) 您应该在路由中定义语言
Route::get('test/{strLang}', 'ProfileController@update');`
以及将其作为变量传递到js代码中的url:'/test/'+strLang
您应该在路由中定义语言
Route::get('test/{strLang}', 'ProfileController@update');`
并将其作为变量传递到js代码中的url:'/test/'+strLang
这是对您问题的完整回答
使用POST请求而不是GET
因为您正在更新用户的语言,所以使用POST请求更安全
// MAKE AJAX CALL
$.ajax( {
// url:'/settings/profile',
url:'./test',
method:'POST',
data: {
strLang: newLang
},
success: function( bolUpdated ) {
if( bolUpdated ) {
alert('OK');
}
},
fail: function() {
alert('NO');
}
});
别忘了在post请求中通过data属性传递strLang
防止CSRF攻击
function initProfileManager() {
// GET ELEMENTS
var domUpdateLanguage = $('#accountLanguage');
var updateLanguage = function() {
// MAKE AJAX CALL
$.ajaxq( {
// url:'/settings/profile',
url:'./test',
method:'GET',
success: function( bolUpdated ) {
if( bolUpdated ) {
alert('OK');
}
},
fail: function() {
alert('NO');
}
});
location.reload();
};
domUpdateLanguage.on( 'change', updateLanguage );
将csrf令牌存储在HTML元标记中:
<meta name="csrf-token" content="{{ csrf_token() }}">
创建一个路由来处理ajax请求:
Route::post('test', 'ProfileController@update');
function update( $request ) {
$objUser = Auth::User();
// UPDATE LANGUAGE
$bolUpdated = $objUser->updateLanguage( $request->strLang );
// RETURN
return response()->json( $bolUpdated );
}
通过控制器中的$request对象获取strLang:
Route::post('test', 'ProfileController@update');
function update( $request ) {
$objUser = Auth::User();
// UPDATE LANGUAGE
$bolUpdated = $objUser->updateLanguage( $request->strLang );
// RETURN
return response()->json( $bolUpdated );
}
如果您使用的是HTML5,那么settings.profile.blade应该如下所示:
<select id="accountLanguage" class="form-control" method="GET">
<option value="en" {{ ($strLanguage == 'en') ? 'selected' : '' }} >English</option>
<option value="es" {{ ($strLanguage == 'es') ? 'selected' : '' }} >Español</option>
<option value="he" {{ ($strLanguage == 'fr') ? 'selected' : '' }} >French</option>
</select>
从select元素获取新的lang:
$('#accountLanguage').change(function () {
initProfileManager(this.value);
});
这是对你问题的完整回答
使用POST请求而不是GET
因为您正在更新用户的语言,所以使用POST请求更安全
// MAKE AJAX CALL
$.ajax( {
// url:'/settings/profile',
url:'./test',
method:'POST',
data: {
strLang: newLang
},
success: function( bolUpdated ) {
if( bolUpdated ) {
alert('OK');
}
},
fail: function() {
alert('NO');
}
});
别忘了在post请求中通过data属性传递strLang
防止CSRF攻击
function initProfileManager() {
// GET ELEMENTS
var domUpdateLanguage = $('#accountLanguage');
var updateLanguage = function() {
// MAKE AJAX CALL
$.ajaxq( {
// url:'/settings/profile',
url:'./test',
method:'GET',
success: function( bolUpdated ) {
if( bolUpdated ) {
alert('OK');
}
},
fail: function() {
alert('NO');
}
});
location.reload();
};
domUpdateLanguage.on( 'change', updateLanguage );
将csrf令牌存储在HTML元标记中:
<meta name="csrf-token" content="{{ csrf_token() }}">
创建一个路由来处理ajax请求:
Route::post('test', 'ProfileController@update');
function update( $request ) {
$objUser = Auth::User();
// UPDATE LANGUAGE
$bolUpdated = $objUser->updateLanguage( $request->strLang );
// RETURN
return response()->json( $bolUpdated );
}
通过控制器中的$request对象获取strLang:
Route::post('test', 'ProfileController@update');
function update( $request ) {
$objUser = Auth::User();
// UPDATE LANGUAGE
$bolUpdated = $objUser->updateLanguage( $request->strLang );
// RETURN
return response()->json( $bolUpdated );
}
如果您使用的是HTML5,那么settings.profile.blade应该如下所示:
<select id="accountLanguage" class="form-control" method="GET">
<option value="en" {{ ($strLanguage == 'en') ? 'selected' : '' }} >English</option>
<option value="es" {{ ($strLanguage == 'es') ? 'selected' : '' }} >Español</option>
<option value="he" {{ ($strLanguage == 'fr') ? 'selected' : '' }} >French</option>
</select>
从select元素获取新的lang:
$('#accountLanguage').change(function () {
initProfileManager(this.value);
});
为什么发帖?它会导致排除问题的csrf。太复杂了。因为Laravel通过一次初始ajaxSetup()就可以很容易地解决这些问题。至于方法:如果你按照“标准”去做,你最终得到的结果是:总是更新为POST或PUT。为什么要发布?它会导致排除问题的csrf。太复杂了。因为Laravel通过一次初始ajaxSetup()就可以很容易地解决这些问题。对于方法:如果你按照“标准”去做,你会得到:总是以POST或PUT的形式更新。谢谢你提供的详细解决方案。我改变了你的建议,似乎我在js
文件中遇到了一个错误<代码>未捕获语法错误:strLang:newLang
部分的意外标识符。我认为这可能与您所说的通过data属性在post请求中传递strLang有关?是的,您必须从axample的输入中获取新的Lang。例如:var newLang=$('#inputId').val()
然后将其传递给数据对象我是否从blade
传递它?您在这里更新的是用户lang,因此当用户选择另一个lang时,您应该调用initProfileManager
,并在参数中选择lang:ExinitProfileManager(this.value)
在AJAX方法中,检查数据属性末尾是否缺少逗号了解详细的解决方案。我改变了你的建议,似乎我在js
文件中遇到了一个错误<代码>未捕获语法错误:strLang:newLang
部分的意外标识符。我认为这可能与您所说的通过data属性在post请求中传递strLang有关?是的,您必须从axample的输入中获取新的Lang。例如:var newLang=$('#inputId').val()
然后将其传递给数据对象我是否从blade
传递它?您在这里更新的是用户lang,因此当用户选择另一个lang时,您应该调用initProfileManager
,并在参数中选择lang:ExinitProfileManager(this.value)
在AJAX方法中,检查数据属性末尾是否缺少逗号