Tutorial Laravel & Inertia.js #5 : Menampilkan Data


Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com
Tutorial Laravel & Inertia.js #5 : Menampilkan Data

Halo teman-teman semuanya, di artikel-artikel sebelumnya kita sudah belajar bagaimana cara installasi dan konfigurasi Inertia.js baik di sisi "server-side" maupun "client-side", sekarang kita lanjutkan belajar bagaimana cara menampilkan data dari database menggunakan Inertia.js dan Vue.js 3 Composition API.

Langkah 1 - Membuat Controller Post

Pertama, kita akan membuat controller terlebih dahulu, silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.

php artisan make:controller PostController

Jika perintah di atas berhasil, maka kita akan mendapatkan 1 file controller baru yang berada di dalam folder app/Http/Controllers/PostController.php. Silahkan buka file tersebut dan ubah kode-nya menjadi seperti berikut ini :

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Inertia\Inertia;

class PostController extends Controller
{    
    /**
     * index
     *
     * @return void
     */
    public function index()
    {
        //get all posts from database
        $posts = Post::latest()->get();

        //render with data "posts"
        return Inertia::render('Post/Index', [
            'posts' => $posts
        ]);
    }
}

Dari perubahan kode di atas, pertama kita melakukan import Model Post terlebih dahulu.

use App\Models\Post;

Setelah itu, kita import Adapter atau Facades dari Inertia.js.

use Inertia\Inertia;

Dan di dalam class PostController, kita menambahkan 1 method baru yang bernama index, method inilah yang akan kita gunakan untuk menampilkan data. Di dalam method ini, pertaama kita melakukan get data dari database melalui Model.

//get all posts from database
$posts = Post::latest()->get();

Setelah itu, kita melakukan render menggunakan Inertia.js ke dalam view atau page Post/Index dan kita parsing juga sebuah props dengan key posts yang berisi variable $posts.

//render with data "posts"
return Inertia::render('Post/Index', [
   'posts' => $posts
]);

Langkah 2 - Menambahkan Route Resource

Setelah berhasil membuat controller baru, sekaranf kita lanjutkan untuk membuat sebuah route baru agar controller beserta method yang akan kita buat nanti bisa berjalan dengan baik.

Silahkan buka file routes/web.php dan ubah semua kode-nya menjadi seperti berikut ini :

<?php

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;

Route::get('/', [\App\Http\Controllers\PostController::class, 'index']);

Route::resource('/posts', \App\Http\Controllers\PostController::class);

Dari perubahan kode route di atas, pertama kita setting default route-nya ke dalam controller PostController dan method index .

Route::get('/', [\App\Http\Controllers\PostController::class, 'index']);

Dan selanjutnya kita membuat route dengan jenis Resource, dengan menggunakan route jenis ini maka kita tidak perlu mendefinisikan route secara manual satu persatu untuk proses CRUD, karena semua sudah dibuatkan oleh Laravel secara otomatis.

Route::resource('/posts', \App\Http\Controllers\PostController::class);

Untuk memverifikasi route yang ada di dalam project kita, silahkan jalankan perintah berikut ini di dalam terminal/CMD :

php artisan route:list

Langkah 3 - Membuat Layout Frontend

Sekarang kita lanjutkan untuk menambahkan layout terlebih dahulu, layout digunakan sebagai induk template yang berisi navbar dan footer.

Silahkan buat folder baru dengan nama Layouts di dalam folder resources/js/ dan di dalam folder Layouts silahkan buat file baru dengan nama App.vue dan masukkan kode berikut ini :

<template>
  <div>
    <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
      <div class="container">
        <inertia-link class="navbar-brand" href="/">LARAVEL + INERTIA.JS</inertia-link>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarCollapse">
          <ul class="navbar-nav me-auto mb-2 mb-md-0">
            <li class="nav-item">
              <inertia-link class="nav-link" href="/posts/">POSTS</inertia-link>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="https://santrikoding.com/ebook" target="_blank">EBOOK</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="https://santrikoding.com/tutorial-set" target="_blank">TUTORIAL SET</a>
            </li>
          </ul>
          <form class="d-flex">
            <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
            <button class="btn btn-success" type="submit">Search</button>
          </form>
        </div>
      </div>
    </nav>
    
    <main class="container mt-5">
      <slot />
    </main>
  </div>
</template>

<script>

	
  //import Link dari inertia
  import { Link } from '@inertiajs/inertia-vue3';

  export default {
		
    //register Link di component
    components: {
      Link
    },
  }
</script>

<style scoped>
    .mt-5 {
      margin-top: 100px!important;
    }
</style>

Langkah 4 - Menampilkan Data

Setelah berhasil membuat Layout, sekarang kita lanjutkan untuk membuat sebuah view untuk menampilkan data, silahkan buat folder baru dengan nama Post di dalam folder resources/js/Pages dan di dalam folder Post silahkan buat file baru dengan nama Index.vue, kemudian masukkan kode berikut ini :

<template>
    <div class="mt-5">
        <!-- flash message -->
        <div v-if="$page.props.flash.message" class="alert alert-success" role="alert">
            {{ $page.props.flash.message }}
        </div>
        <!-- flash message -->
        <div class="mb-3">
            <inertia-link href="/posts/create" class="btn btn-md btn-primary">TAMBAH DATA</inertia-link>
        </div>
        <div class="card border-0 rounded shadow-sm">
            <div class="card-body">
                <table class="table">
                    <thead>
                        <tr>
                            <th scope="col">TITLE</th>
                            <th scope="col">CONTENT</th>
                            <th scope="col">ACTIONS</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr v-for="post in posts" :key="post.id">
                            <td>{{ post.title }}</td>
                            <td>{{ post.content }}</td>
                            <td class="text-center"></td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</template>

<script>
    //import layout
    import LayoutApp from '../../Layouts/App.vue'
    
    //import Link dari inertia
    import { Link } from '@inertiajs/inertia-vue3';

    export default {

        //layout
        layout: LayoutApp,
        
        //register Link di component
        components: {
            Link
        },

        //props
        props: {
            posts: Array // <- nama props yang dibuat di controller saat parsing data
        }
    }
</script>

<style>

</style>

Dari penambahan kode di atas, pertama kita melakukan import Layout yang sebelumnya sudah kita buat.

//import layout
import LayoutApp from '../../Layouts/App.vue'

Setelah itu, kita register Layout tersebut ke dalam properti layout.

//layout
layout: LayoutApp,

Dan selanjutnya, untuk menerima data yang di parsing dari conttroller, kita menggunakan props dan kita tinggal panggil nama props-nya dan jenis data-nya.

//props
props: {
  posts: Array // <- nama props yang dibuat di controller saat parsing data
}

Di atas nama props-nya adalah posts, dimana nama tersebut kita definisikan saat parsing data di dalam method index di controller PostController.

Dan untuk menampilkan di template, kita tinggal menggunakan directive v-for dari Vue.js, kurang lebih seperti berikut ini :

<tr v-for="post in posts" :key="post.id">
    <td>{{ post.title }}</td>
    <td>{{ post.content }}</td>
    <td class="text-center"></td>
</tr>

Dan untuk menampilkan flash message, kita menggunakan kode seperti berikut ini di dalam template.

<!-- flash message -->
<div v-if="$page.props.flash.message" class="alert alert-success" role="alert">
   {{ $page.props.flash.message }}
</div>
<!-- flash message -->

Kode tersebut akan dijalankan nanti saat kita membuat proses insert, update dan delete data.

Langkah 5 - Compiling Assets dan Menjalankan Project

Ketika kita melakukan perubahan di dalam file folder resources/js maka kita perlu melakukan compile ulang agar kode assets-nya diperbarui.

Jalankan perintah berikut ini di dalam terminal/CMD :

npm run dev

Atau jika pengen otomatis melakukan compile saat kita melakukan perubahan di dalam file, kita bisa menjalankan perintah berikut ini di dalam terminal/CMD :

npm run watch

Setelah proses compiling selesai, sekarang kita bisa buka project-nya di URL http://localhost:8000/ dan jika berhasil maka kita akan mendapatkan hasil seperti berikut ini :

Di atas kita tidak menampilkan data apapun, karena memang di dalam database kita belum memiliki data dan di artikel selanjutnya kita akan belajar bagaimana cara memasukkan atau insert data ke dalam database menggunakan Inertia.js.

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