laravelvue.jsinertiajs

POST http://127.0.0.1:8000/admin/sparepart 404 (Not Found) when i try to Inertia.post('/admin/sparepart', formData)


I use Laravel, Inertia and Vue.

When I submitted the form, the page returned a 404 not found window and the console said POST http://127.0.0.1:8000/admin/sparepart 404 (Not Found)

I don't know if it's because of an error in the route or if the form wasn't sent correctly to the backend.

This is from the network header tabs:

Request URL:
http://127.0.0.1:8000/admin/sparepart
Request Method:
POST
Status Code:
404 Not Found
Remote Address:
127.0.0.1:8000
Referrer Policy:
strict-origin-when-cross-origin

In the payload, it seems the formData does exist:

nama_sparepart: as
harga: 2
stok: 2
kategori_id: 1
image: (binary)

I'm using Route::resource Route::resource('/admin/sparepart', SparepartController::class); and yeah it does exist when I use route::list

GET|HEAD admin/sparepart ....................................... sparepart.index › SparepartController@index POST admin/sparepart ....................................... sparepart.store › SparepartController@store

controller:

public function store(Request $request){
        $request->validate([
            'nama_sparepart' => 'required|string|max: 25',
            'harga' => 'required|number',
            'stok' => 'required|number',
            'image' => 'required|image',
            'kategori_id' => 'required',
        ]);

        $image = $request->file('image');
        $image->storeAs('public/spareparts', $image->hashname());

        $sparepart = Sparepart::create([
            'nama_sparepart' => $request->nama_sparepart,
            'harga' => $request->harga,
            'stok' => $request->stok,
            'image' => $image->hashName(),
            'kategori_id' => $request->kategori_id,
        ]);

        if($sparepart){
            return Redirect::route('sparepart.index')->with('message', 'success');
        }

Vue scripts

<script setup>
    import { reactive } from 'vue'
    import { Inertia } from '@inertiajs/inertia'

        //props
        defineProps({
            errors: Object,
            kategori: Array
        })

            //state posts
            const sparepart = reactive({
                nama_sparepart  : '',
                harga           : '',
                stok            : '',
                image           : null,
                kategori_id     : ''
            })

            function handleImageUpload(event) {
                const file = event.target.files[0]
                 console.log("File yang dipilih:", file);
                if (file) {
                    sparepart.image = file // Simpan file ke state
                }
            }

         //function storePost
function storePost() {
    console.log("State sebelum dikirim:", sparepart);
    const formData = new FormData()
    formData.append('nama_sparepart', sparepart.nama_sparepart)
    formData.append('harga', sparepart.harga)
    formData.append('stok', sparepart.stok)
    formData.append('kategori_id', sparepart.kategori_id)
    if (sparepart.image) {
        formData.append('image', sparepart.image) // Sertakan file gambar
    }


    // Debugging FormData
    for (let [key, value] of formData.entries()) {
        console.log(key + ': ' + value);
    }

    // Kirim data dengan FormData
    Inertia.post('/admin/sparepart', formData)

}
</script>

Vue page:

<template>
     <div>
        <div class="card border-0 rounded shadow">
            <div class="card-body">
                <h4>TAMBAH POST</h4>
                <hr>
                <form @submit.prevent="storePost" enctype="multipart/form-data">

                    <div>
                        <label for="image">Gambar</label>
                        <input type="file" id="image" @change="handleImageUpload" accept="image/*" />
                        <span v-if="errors.image">{{ errors.image }}</span>
                    </div>

                    <div class="mb-3">
                        <label class="form-label">Nama Sparepart</label>
                        <input type="text" class="form-control" v-model="sparepart.nama_sparepart" placeholder="Masukkan Title Post">
                        <div v-if="errors.nama_sparepart" class="mt-2 alert alert-danger">
                            {{ errors.nama_sparepart }}
                        </div>
                    </div>

                    <div class="mb-3">
                        <label class="form-label">Harga</label>
                        <input type="number" class="form-control" v-model="sparepart.harga" placeholder="Masukkan Title Post">
                        <div v-if="errors.harga" class="mt-2 alert alert-danger">
                            {{ errors.harga }}
                        </div>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">Stok</label>
                        <input type="number" class="form-control" v-model="sparepart.stok" placeholder="Masukkan Title Post">
                        <div v-if="errors.stok" class="mt-2 alert alert-danger">
                            {{ errors.stok }}
                        </div>
                    </div>

                    <div>
                        <label for="kategori_id">Kategori</label>
                        <select v-model="sparepart.kategori_id" id="kategori_id">
                            <option value="">Pilih Kategori</option>
                            <option v-for="k in kategori" :key="k.id" :value="k.id">{{ k.nama_kategori }}</option>
                        </select>
                        <span v-if="errors.kategori_id">{{ errors.kategori_id }}</span>
                    </div>

                    <!-- Tombol Submit -->
                    <button type="submit">Submit</button>
                </form>
            </div>
        </div>
    </div>

</template>

I tried to do a manual route(like Route::post('url',[controller class])), but I still get a 404.


Solution

  • i changed the routes from

    Route::middleware('admin')->group(function () {
    
    Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard');
    Route::get('/admin/admin-control', [AdminController::class, 'showAdmin'])->name('admin.show');
    Route::get('/admin/create', [AdminController::class, 'addAdmin'])->name('admin.create');
    Route::post('/admin/create', [AdminController::class, 'store'])->name('admin.createSubmit');
    Route::get('/admin/{id}/edit', [AdminController::class, 'edit'])->name('admin.edit');
    Route::post('/admin/edit', [AdminController::class, 'update'])->name('admin.update');
    Route::post('/admin/{id}', [AdminController::class, 'destroy'])->name('admin.delete');
    
    /*-------------Sparepart-------------- */
    Route::resource('/admin/sparepart', SparepartController::class);
    /*-----------End sparepart-------------- */
    

    }); to

    Route::middleware('admin')->group(function () {
    
    Route::resource('/admin/sparepart', SparepartController::class);
    
    Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard');
    Route::get('/admin/admin-control', [AdminController::class, 'showAdmin'])->name('admin.show');
    Route::get('/admin/create', [AdminController::class, 'addAdmin'])->name('admin.create');
    Route::post('/admin/create', [AdminController::class, 'store'])->name('admin.createSubmit');
    Route::get('/admin/{id}/edit', [AdminController::class, 'edit'])->name('admin.edit');
    Route::post('/admin/edit', [AdminController::class, 'update'])->name('admin.update');
    Route::post('/admin/{id}', [AdminController::class, 'destroy'])->name('admin.delete');
    

    });