1

Tengo un problema muy extraño con laravel resulta que eh estado trasteando un poco con fetch para enviar solicitudes ajax. Entonces cree esta funcion para enviar mis solicitudes con ajax

function fetchRequest(op) {
    const { url, method, data, isFormData, successCallback, errorCallback } = op;
    console.log("Fetching:", url, method); 

    const headers = {
        Accept: "application/json",
        "X-CSRF-TOKEN": document
            .querySelector('meta[name="csrf-token"]')
            .getAttribute("content"),
    };

    if (!isFormData) {
        headers["Content-Type"] = "application/json";
    }

    const options = {
        method,
        headers,
        body: isFormData ? data : JSON.stringify(data),
    };

    fetch(url, options)
        .then((response) => {
            if (!response.ok) {
                throw new Error(`Error en la solicitud: ${response.statusText}`);
            }
            return response.json();
        })
        .then((responseData) => successCallback(responseData))
        .catch((error) => errorCallback(error.message));
}

Si por ejemplo uso el metodo POST del ajax funciona como deberia. Esta es la funcion con post:

function createPlatform(){
    const form = document.querySelector("#formCreatePlatform");

    if (form) {

        form.addEventListener('submit', function (e) {
            e.preventDefault();

            const formData = new FormData(form);

            fetchRequest({
                url: "/admin/platforms/",
                method: "POST",
                data: formData,
                isFormData: true,
                successCallback: function (data) {
                    console.log(data);
                },
                errorCallback: function (error) {
                    toastifyAlerts(error, "error");
                    console.error("Error:", error);
                },
            });

        });
    }
}

y su controller


    public function store(Request $request){
        return response()->json($request);

    }

Bastante simple solo queria ver que los datos enviados desde el form lleguen al controller. Ahora el problema es cuando uso el metodo UPDATE.

function updatePlatform() {
    const formUpdate = document.querySelector("#formUpdatePlatform");

    if (formUpdate) {


        formUpdate.addEventListener('submit', function (e) {
            e.preventDefault();

            const id = document.querySelector("#id_platform").value;
            const formDataUpdate = new FormData(formUpdate);

            fetchRequest({
                url: "/admin/platforms/" + id,
                method: "PUT",
                data: formDataUpdate,
                isFormData: true,
                successCallback: function (data) {
                    console.log(data);
                },
                errorCallback: function (error) {
                    console.error("Error:", error);
                },
            });

        });
    }
}

Practicamente es un copia y pega de la funcion js para crear. Su controller igual es bastante simple solo tengo esto.

 public function update(Request $request, $id) {
        return response()->json($request);
    }
    

Sin embargo en este caso del update no me esta llegando ningun dato al servidor solo me encuentro con un array vacio. No entiendo por que este problema si ambos metodos son practicamente iguales. No hay errores en consola ni en el log de laravel simplemente no me llega ningun dato al backend. No se que podria estar mal. Por ultimo estas es la ruta

Route::resource('/admin/platforms', PlatformsController::class)->names('platforms');

Por mas que cambie cosas sigo con este problema no entiendo que esta mal porque solo funciona en el metodo post pero un put no. ¿Que podria estar mal?

3
  • 1
    El problema probablemente es que PUT no es un valor válido para HTML. Entonces tienes que usar method: 'POST' y enviar una variable _method='PUT' para que Laravel escoja la ruta correcta laravel.com/docs/10.x/routing#form-method-spoofing Commented el 20 ene. a las 23:29
  • En HTML no se puede declarar PUT como METHOD. w3schools.com/tags/att_form_method.asp Commented el 22 ene. a las 16:45
  • Gracias por tu comentario @AlexAngelico pero si fuera ese el problema deberia mandarme un mensaje en consola de metodo no encontrado. Igual por si acaso lo probe y tampoco funciona todo sigue igual. Commented el 22 ene. a las 17:01

0

Examina otras preguntas con la etiqueta o formula tu propia pregunta.