Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对控制器的laravelajax调用_Javascript_Php_Ajax_Laravel_Controller - Fatal编程技术网

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:Ex
initProfileManager(this.value)
在AJAX方法中,检查数据属性末尾是否缺少逗号了解详细的解决方案。我改变了你的建议,似乎我在
js
文件中遇到了一个错误<代码>未捕获语法错误:
strLang:newLang
部分的意外标识符。我认为这可能与您所说的通过data属性在post请求中传递strLang有关?是的,您必须从axample的输入中获取新的Lang。例如:
var newLang=$('#inputId').val()
然后将其传递给数据对象我是否从
blade
传递它?您在这里更新的是用户lang,因此当用户选择另一个lang时,您应该调用
initProfileManager
,并在参数中选择lang:Ex
initProfileManager(this.value)
在AJAX方法中,检查数据属性末尾是否缺少逗号