Tutorial Laravel 9 dan Svelte #5 : Insert Data di Svelte Kit


Tutorial Laravel 9 dan Svelte #5 : Insert Data di Svelte Kit

Halo teman-teman semuanya, pada artikel sebelumnya kita sudah belajar bagaimana cara menampilkan data di Svelte menggunakan Rest API dari Laravel. Sekarang kita akan lanjutkan belajar bagaimana cara melakukan proses insert data di Svelete menggunakan Rest API dan kita juga akan belajar melakukan proses upload gambar.

Langkah 1 - Membuat Halaman Create Post

Sekarang kita akan membuat halaman yang nanti kita gunakan untuk menampilkan form input data dan sekaligus membuat proses insert-nya ke dalam database melalui Rest API.

Silahkan buat folder baru dengan nama create di dalam folder src/routes/posts dan di dalam folder create silahkan buat file baru dengan nama index.svelte, kemudian masukkan kode berikut ini di dalamnya.

<script>
    //import axios
    import axios from 'axios';

    //import Goto navigation
    import { goto } from '$app/navigation';

    //define variable
    let files   = '' ;
    let title   = '';
    let content = '';
    let validation = {};

    //method "storePost"
    const storePost = ( async () => {

        //define formData
        const formData = new FormData();

        //append data to "formData"
        formData.append('image', files[0]);
        formData.append('title', title);
        formData.append('content', content);

        //send data to server
        await axios.post('http://localhost:8000/api/posts', formData)
        .then(() => {

            //redirect
            goto("/posts");

        })
        .catch((error) => {

            //assign validation on variable
            validation = error.response.data
        })

    });
</script>

<div class="card border-0 rounded-3 shadow-sm">
    <div class="card-body">
        <form on:submit|preventDefault={storePost}>

            <div class="form-group mb-3">
                <!-- svelte-ignore a11y-label-has-associated-control -->
                <label class="form-label fw-bold">Image</label>
                <input type="file" accept="image/png, image/jpeg" bind:files class="form-control"/>
            </div>
            {#if validation.image}
                <!-- svelte-ignore invalid-html-attribute -->
                <div class="alert alert-danger">
                    {validation.image}
                </div>
            {/if}
            

            <div class="form-group mb-3">
                <!-- svelte-ignore a11y-label-has-associated-control -->
                <label class="form-label fw-bold">TITLE</label>
                <input class="form-control" bind:value={title} type="text" placeholder="Masukkan Title" />
            </div>
            {#if validation.title}
                <!-- svelte-ignore invalid-html-attribute -->
                <div class="alert alert-danger">
                    {validation.title}
                </div>
            {/if}


            <div class="form-group mb-3">
                <!-- svelte-ignore a11y-label-has-associated-control -->
                <label class="form-label fw-bold">CONTENT</label>
                <textarea class="form-control" rows={3} placeholder="Masukkan Content" bind:value={content} />
            </div>
            {#if validation.content}
                <!-- svelte-ignore invalid-html-attribute -->
                <div class="alert alert-danger">
                    {validation.content}
                </div>
            {/if}


            <button class="btn btn-primary border-0 shadow-sm" type="submit">
                SIMPAN
            </button>
        </form>
    </div>
</div>

Dari penambahan kode di atas, pertama kita import Axios terlebih dahulu. Karena kita akan gunakan untuk melakukan HTTP request ke server melalui Rest API.

//import axios
import axios from 'axios';

Kemudian kita import goto dari navigation. Ini akan kita gunakan untuk melakukan redirect atau berpindah halaman setelah proses insert berhasil dilakukan.

//import Goto navigation
import { goto } from '$app/navigation';

Setelah itu, kita define beberapa variable yang nanti akan digunakan untuk menampung data yang diinputkan di dalam form.

//define variable
let files = '';
let title = '';
let content = '';
let validation = {};

Di bawahnya, kita membuat method baru dengan nama storePost. Method tersebut akan dijalankan ketika form disubmit.

<form on:submit|preventDefault={storePost}>

	//...
	
</form>
//method "storePost"
const storePost = ( async () => {

	//...

}

Di dalam method storePost, pertama kita deine FormData terlebih dahulu. Ini akan kita manfaatkan untuk menampung data dari form sebelum dikirimkan ke dalam server / backend melalui Rest API.

//define formData
const formData = new FormData();

Kemudian kita append beberapa data yang di dapatkan dari form yang disimpan di dalam variable yang sudah kita buat sebelumnya ke dalam formData.

//append data to "formData"
formData.append('image', files[0]);
formData.append('title', title);
formData.append('content', content);

Setelah data berhasil disimpan di dalam formData, selanjutnya kita akan kirimkan ke dalam server / backend menggunakan Axios ke endpoint http://localhost:8000/api/posts dengan method POST.

//send data to server
await axios.post('http://localhost:8000/api/posts', formData)

Jika proses insert data berhasil dilakukan, selanjutnya kita akan redirect ke dalam URL /posts menggunakan goto.

//redirect
goto("/posts");

Tapi, jika proses insert data gagal dilakukan, maka kita akan assign error response validasi ke dalam variable validation.

//assign validation on variable
validation = error.response.data

Dan untuk menampilkan validasi di dalam template / HMTL, kita bisa menggunakan {# if} ... {/if}. Kurang lebih seperti berikut ini.

{#if validation.title}
   <!-- svelte-ignore invalid-html-attribute -->
   <div class="alert alert-danger">
      {validation.title}
   </div>
{/if}

Dan untuk mendapatkan value yang ada di dalam input, kita bisa menggunakan bind:value={nama_variable}. Kurang lebih seperti ini contohnya.

<input class="form-control" bind:value={title} type="text" placeholder="Masukkan Title" />

Langkah 2 - Uji Coba Insert Data

Sekarang silahkan klik button TAMBAH yang ada pada halaman posts index, atau bisa ke URL berikut ini http://localhost:3000/posts/create, jika berhasil maka kita akan mendapatkan hasil seperti berikut ini.

Silahkan klik button SIMPAN tanpa mengisi data apapun, maka kita akan mendapatkan validasi yang dikirimkan oleh controller, kurang lebih seperti berikut ini.

Dan sekarang, silahkan masukkan data gambar, title dan content, kemudian klik button SIMPAN. Jika berhasil maka kita akan di arahkan ke dalam halaman posts index dengan data yang baru saja kita inputkan.

Sampai disini pembahasan bagaimana cara melakukan proses insert data di dalam Svelte menggunakan Rest API yang dibuat di Laravel. Di artikel berikutnya kita akan belajar bagaimana cara melakukan proses edit dan update data ke dalam database menggunakan Svelte.

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami