我对Laravel
很新,我在访问Controller
中的特定方法时遇到问题。我正在尝试根据下拉菜单更改数据库值(语言)。
settings.profile.blade
<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>
ProfileController可
public function index() {
$objUser = Auth::User();
$strLanguage = $objUser->lang;
return view("application.settings.profile",[
'objUser' => $objUser,
'strLanguage' => $strLanguage
]);
}
// THE METHOD I NEED ACCESS TO
function update( $strLang ) {
$objUser = Auth::User();
// UPDATE LANGUAGE
$bolUpdated = $objUser->updateLanguage( $strLang );
// RETURN
return response()->json( $bolUpdated );
}
路线
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 );
目前的方式是,我收到此错误Too few arguments to function App\Http\Controllers\Settings\ProfileController::update(), 0 passed and exactly 1 expected
。我理解错误,但不知道如何传递参数。
如果我取消注释url
中的JS
行,我从未进入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 );
}
答案 0 :(得分:2)
这是对您的问题的完整答案
使用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');
}
});
并且不要忘记通过数据属性传递帖子请求中的strLang。
防止CSRF攻击
将csrf令牌存储在HTML元标记中:
<meta name="csrf-token" content="{{ csrf_token() }}">
自动将令牌添加到所有请求标头:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
创建处理ajax请求的路由:
Route::post('test', 'ProfileController@update');
通过控制器中的$ request对象获取strLang:
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>
在你的索引方法中,$ objUser已经包含了lang属性
public function index() {
$objUser = Auth::User();
return view("application.settings.profile",[
'objUser' => $objUser
]);
}
从select元素中获取新的lang:
$('#accountLanguage').change(function () {
initProfileManager(this.value);
});
答案 1 :(得分:1)
将您的路线更改为:
Route::post('test', 'ProfileController@update');
和你的ajax对象:
method:'POST',
你必须以某种方式实际传递$ strLang(因为update()方法需要这个,因为错误消息说明了。)
哦,你真的不需要选择HTML中的method属性;)
答案 2 :(得分:1)
您应该在路线中定义语言
Route::get('test/{strLang}', 'ProfileController@update');`
以及将其作为变量传递给js代码中的url:'/test/' + strLang