javascript - Laravel Ajax 调用 Controller

标签 javascript php ajax laravel controller

我是 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>

配置文件 Controller

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。我理解错误,但不确定如何传递参数。

如果我取消注释 JS 中的 url 行,我永远不会进入 update 方法,我只是运行 索引两次。

如有任何帮助,我们将不胜感激。

编辑 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 );
}

最佳答案

这是对你问题的完整回答

使用 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 token 存储在 HTML 元标记中:

<meta name="csrf-token" content="{{ csrf_token() }}">

自动将 token 添加到所有请求 header :

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

创建一个路由来处理您的 ajax 请求:

Route::post('test', 'ProfileController@update');

通过 Controller 中的 $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>

在你的index方法中,$objUser已经包含了lang属性

public function index() {

    $objUser = Auth::User();

    return view("application.settings.profile",[
        'objUser' => $objUser
    ]); 

}  

从选择元素获取新语言:

$('#accountLanguage').change(function () {
     initProfileManager(this.value);
});

关于javascript - Laravel Ajax 调用 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47147793/

相关文章:

javascript - 无法从 dojo 模板中的按钮获取事件

javascript - Angular.js ng-submit 触发了两次并且没有从表单中获取值

jquery - 为什么 bottle 中的 request.json 返回 None?

jquery - 通过ajax从cropit插件上传图像

javascript - 如何使用 Ajax 调用更新部分内容然后在 Rails 中呈现?

javascript - 单击按钮后播放HTML音频

php - 启用&lt;textarea&gt;显示HTML内容,例如粗体,斜体,颜色,img标签

php - PHP执行前的确认提示

php - 子域的 CSS 文件的相对路径

mysql - Node.js - 如何通过 AJAX 传递多个 MySQL 查询参数