首页 > 解决方案 > Ajax 请求不向控制器方法发送数据

问题描述

我是 laravel 8 和 ajax 的新手,我也在一个小组中工作。我有一个刀片视图来查看用户的数据,因为从这个视图中我希望可以在没有表单标签的情况下修改一些数据,所以我制作了一个 js 脚本来将要修改的新数据发送到一个控制器,但是这个数据永远不会到达控制器,因为我注意到 mysql db 和 profilo 视图没有更新,但是一些“调试”打印输出报告成功。

我哪里错了?提前致谢。

这是控制器

class ProfiloUtente extends Controller{

    public function visualizzaProfiloUtente(Request $request)
    {
        $id_utente = $request->session()->get('LoggedUser');
        $flag_attore = $request->session()->get('Attore');
        $utente = null;

        if ($flag_attore === Attore::CITTADINO_PRIVATO) {
            $utente = CittadinoPrivato::getById($id_utente);
        }
        if ($flag_attore === Attore::DATORE_LAVORO) {
            $utente = DatoreLavoro::getById($id_utente);
        }
        if ($flag_attore === Attore::MEDICO_MEDICINA_GENERALE) {
            $utente = MedicoMG::getById($id_utente);
        }

        return view('profilo', compact('utente'));
    }

    public function modificaProfiloUtente(Request $request)
    {
        $id_utente = $request->session()->get('LoggedUser');
        $flag_attore = $request->session()->get('Attore');
        $this->validation($request);
        $input = $this->generalInput($request);

        try {
            User::updateInfo($id_utente, $input['nuovo_codice_fiscale'], $input['nome'], $input['cognome'], $input['citta_residenza'],
                $input['provincia_residenza'], $input['email'], $input['password']);

            if ($flag_attore === Attore::CITTADINO_PRIVATO) {
                CittadinoPrivato::updateCittadino($input['codice_fiscale_attuale'], $input['nuovo_codice_fiscale']);
            }
            elseif ($flag_attore === Attore::DATORE_LAVORO) {
                $input['partita_iva'] = $request->input('iva');
                $input['nome_azienda'] = $request->input('nome_azienda');
                $input['citta_azienda'] = $request->input('citta_sede_aziendale');
                $input['provincia_azienda'] = $request->input('provincia_sede_aziendale');
                DatoreLavoro::updateDatore($input['codice_fiscale_attuale'], $input['nuovo_codice_fiscale'], $input['partita_iva'], $input['nome_azienda'], $input['citta_azienda'], $input['provincia_azienda']);
            }
            elseif ($flag_attore === Attore::MEDICO_MEDICINA_GENERALE) {
                $input['partita_iva'] = $request->input('iva');
                MedicoMG::updateMedico($input['codice_fiscale_attuale'], $input['nuovo_codice_fiscale'], $input['partita_iva']);
            }
        }
        catch(QueryException $ex){
            return back()->with('update-error', 'Errore, modifica non avvenuta.');
        }

        return redirect('/profilo');
    }
    
    /**
     * Raggruppa le validazioni dei dati comuni
     * @param Request $request
     */
    private function validation(Request $request) {
        $validation = $request->validate([
            'cf' => 'required|min:16|max:16',
            'nome' => 'required|max:30',
            'cognome' => 'required|max:30',
            'citta_residenza' => 'required|max:50',
            'provincia_residenza' => 'required|max:50',
            'email' => 'required|email',
            'psw' => 'required|min:8|max:40'
        ]);
    }

    private function generalInput(Request $request)
    {
        $input = [];
        $input['nuovo_codice_fiscale'] = $request->input('cf');
        $input['codice_fiscale_attuale'] = $request->input('cf_attuale');
        $input['nome'] = $request->input('nome');
        $input['cognome'] = $request->input('cognome');
        $input['citta_residenza'] = $request->input('citta_residenza');
        $input['provincia_residenza'] = $request->input('provincia_residenza');
        $input['email'] = $request->input('email');
        $input['password'] = $request->input('psw');
        return $input;
    }
}

这是路线

Route::post('/modificaProfilo', [ProfiloUtente::class, 'modificaProfiloUtente'])->name('modifica.profilo');

这是刀片视图中 ajax 请求的脚本

var data = '<?php echo json_encode($utente) ?>';
data = JSON.parse(data);

getDataProfilePage(data); //get values ​​to update 

sendDataProfilePage(data,"{{route('modifica.profilo') }}","{{csrf_token()}}");

public/script/script.js 中的 sendDataProfilePage 函数

function sendDataProfilePage(data, url, csrfToken) {

    var formData = new FormData();

    formData.append("_token", csrfToken);

    for (key in data) {

        if (key == "codice_fiscale") {

            formData.append("cf", data[key]);
            formData.append("cf_attuale", data[key]);

        } else if (key == "password") {

            formData.append("psw", data[key]);

        } else if (key == "partita_iva") {

            formData.append("iva", data[key]);

        } else {

            formData.append(key, data[key])
        }

    }

    for (var pair of formData.entries()) { //print for feedback
        console.log(pair[0] + ', ' + pair[1]);
    }



    //send data
    var request = new XMLHttpRequest();
    request.open("POST", url);

    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("X-CSRF-TOKEN", csrfToken);

    request.onreadystatechange = function() {

        console.log("ready state " + request.readyState); //print for feedback
        console.log("status  " + request.status); //print for feedback

        if (request.readyState === XMLHttpRequest.DONE) {

            if (status === 0 || (status >= 200 && status < 400)) { //detect request succes

                console.log("responseStatus  " + request.status + " " + request.statusText); //print for feedback

            } else {
                console.log("responseStatus  " + request.status + " " + request.statusText); //print for feedback
            }
        }
    };

    request.send(formData);
}

标签: javascriptajaxlaravel

解决方案


发送一个 FormData 对象,其内容类型为 multipart/form-data 而不是 application/x-www-form-urlencoded。在您的代码中删除您设置内容类型标头的行,将自动设置正确的内容类型标头。


推荐阅读