Laravel + Inertia.js: Membangun Aplikasi Modern Tanpa Meninggalkan Laravel
Dalam dunia pengembangan web modern yang serba cepat, pengembang terus mencari cara untuk menyederhanakan alur kerja mereka, meningkatkan produktivitas, dan memberikan pengalaman pengguna yang luar biasa. Laravel, kerangka kerja PHP yang populer, telah lama menjadi pilihan utama bagi banyak orang. Namun, untuk membangun antarmuka pengguna yang dinamis dan interaktif, pengembang sering kali beralih ke kerangka kerja JavaScript seperti React, Vue.js, atau Angular. Di sinilah Inertia.js masuk.
Inertia.js adalah jembatan yang memungkinkan Anda membangun aplikasi front-end modern menggunakan Vue.js, React, atau Svelte tanpa meninggalkan kenyamanan dan familiaritas Laravel. Dalam panduan lengkap ini, kita akan menjelajahi Inertia.js secara mendalam, memahami manfaatnya, dan mempelajari cara menggunakannya untuk membangun aplikasi web yang kuat dan efisien.
Mengapa Memilih Laravel dan Inertia.js?
Sebelum kita masuk ke detail teknis, mari kita pahami mengapa kombinasi Laravel dan Inertia.js begitu menarik:
- Pengembangan Full-Stack yang Disederhanakan: Inertia.js memungkinkan Anda untuk tetap berada di ekosistem Laravel yang sudah dikenal, menggunakan Blade untuk rendering sisi server awal dan mengandalkan JavaScript untuk interaktivitas sisi klien. Ini menghilangkan kebutuhan untuk membangun API terpisah dan memelihara dua codebase yang berbeda.
- Pengalaman Pengembang yang Lebih Baik: Inertia.js menyederhanakan alur kerja pengembangan Anda dengan menghilangkan kompleksitas routing API dan pengambilan data sisi klien. Anda dapat fokus pada logika bisnis dan antarmuka pengguna, menyerahkan detail implementasi ke Inertia.js.
- Performa yang Lebih Baik: Inertia.js menggunakan pendekatan “tanpa API” yang unik. Sebagai gantinya, server Anda merender komponen front-end sebagai respons terhadap permintaan. Ini menghasilkan pengalaman pengguna yang lebih cepat dan lebih responsif dibandingkan dengan aplikasi SPA tradisional.
- SEO-Friendly: Karena Inertia.js mengandalkan rendering sisi server awal, aplikasi Anda mudah diindeks oleh mesin pencari, yang mengarah pada peringkat SEO yang lebih baik.
- Reusable Components: Inertia.js memungkinkan Anda untuk membangun komponen front-end yang dapat digunakan kembali di seluruh aplikasi Anda, mempromosikan konsistensi dan mengurangi duplikasi kode.
Memahami Konsep Inertia.js
Untuk memahami cara kerja Inertia.js, penting untuk memahami konsep intinya:
- Komponen: Seperti kerangka kerja JavaScript modern lainnya, Inertia.js dibangun di atas komponen. Komponen adalah blok bangunan antarmuka pengguna Anda.
- Props: Data yang diteruskan dari server ke komponen front-end Anda disebut props.
- Pages: Inertia.js memperkenalkan konsep “pages”, yang merupakan komponen root yang merender tampilan tertentu dalam aplikasi Anda.
- Visits: Inertia.js menggunakan “visits” untuk menavigasi antara halaman. Visits adalah permintaan AJAX yang memperbarui DOM tanpa memuat ulang halaman penuh.
- Shared Data: Inertia.js memungkinkan Anda untuk berbagi data antara server dan client secara otomatis, seperti informasi pengguna yang diautentikasi atau pengaturan konfigurasi.
Menyiapkan Proyek Laravel dengan Inertia.js
Sekarang, mari kita mulai dengan menyiapkan proyek Laravel dengan Inertia.js. Kami akan menggunakan Vue.js sebagai kerangka kerja front-end kami, tetapi prosesnya serupa untuk React dan Svelte.
Prasyarat
- PHP (versi 8.0 atau lebih tinggi)
- Composer
- Node.js dan npm
- Database (MySQL, PostgreSQL, atau SQLite)
Langkah-langkah Instalasi
- Buat Proyek Laravel Baru:
Buka terminal Anda dan jalankan perintah berikut untuk membuat proyek Laravel baru:
composer create-project laravel/laravel inertia-app
- Masuk ke Direktori Proyek:
cd inertia-app
- Instal Inertia.js:
Jalankan perintah berikut untuk menginstal Inertia.js dan adapter Vue.js:
composer require inertiajs/inertia-laravel npm install @inertiajs/vue3 vue3
- Instal Vite:
Vite adalah bundler build yang sangat cepat untuk aplikasi front-end modern.
npm install vite @vitejs/plugin-vue --save-dev
- Konfigurasi Vite:
Buat file
vite.config.js
di root proyek Anda dengan konten berikut:import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; import vue from '@vitejs/plugin-vue'; export default defineConfig({ plugins: [ laravel({ input: ['resources/js/app.js'], refresh: true, }), vue({ template: { transformAssetUrls: { base: null, includeAbsolute: false, }, }, }), ], resolve: { alias: { '@': '/resources/js', } } });
- Konfigurasi Inertia Middleware:
Buka
app/Http/Kernel.php
dan tambahkan\Inertia\Middleware
ke grup middlewareweb
:protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Inertia\Middleware::class, // Tambahkan middleware Inertia ], 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
- Buat Root Template:
Buat file
resources/views/app.blade.php
dengan konten berikut:<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{{ config('app.name', 'Laravel') }}</title> <!-- Fonts --> <link rel="preconnect" href="https://fonts.bunny.net"> <link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" /> <!-- Scripts --> @vite(['resources/js/app.js']) @inertiaHead </head> <body class="font-sans antialiased"> @inertia </body> </html>
- Inisialisasi Inertia di JavaScript:
Buka
resources/js/app.js
dan modifikasi seperti berikut:import './bootstrap'; import { createApp, h } from 'vue'; import { createInertiaApp } from '@inertiajs/vue3'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; createInertiaApp({ resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')), setup({ el, App, props, plugin }) { return createApp({ render: () => h(App, props) }) .use(plugin) .mount(el) }, });
- Jalankan Migrasi Database dan Server Pengembangan:
Pastikan Anda telah mengkonfigurasi koneksi database Anda di file `.env`. Kemudian, jalankan:
php artisan migrate npm run dev
Sekarang, Anda telah berhasil menyiapkan proyek Laravel dengan Inertia.js dan Vue.js. Anda dapat mulai membangun antarmuka pengguna Anda menggunakan komponen Vue.js dan menggunakan Inertia.js untuk mengelola routing dan pengambilan data.
Membuat Halaman Pertama Anda dengan Inertia.js
Mari kita buat halaman sederhana untuk menunjukkan cara kerja Inertia.js. Kita akan membuat halaman “Selamat Datang” yang menampilkan pesan selamat datang.
- Buat Komponen Vue.js:
Buat file
resources/js/Pages/Welcome.vue
dengan konten berikut:<template> <div> <h1>Selamat Datang!</h1> <p>Selamat datang di aplikasi Inertia.js pertama Anda!</p> <p>Pesan: {{ message }}</p> </div> </template> <script> export default { props: { message: { type: String, required: true, }, }, }; </script>
- Buat Route Laravel:
Buka
routes/web.php
dan tambahkan route berikut:use Inertia\Inertia; use Illuminate\Support\Facades\Route; Route::get('/', function () { return Inertia::render('Welcome', [ 'message' => 'Hello dari Laravel!', ]); });
- Akses Halaman di Browser:
Buka browser Anda dan kunjungi
http://localhost:8000
. Anda akan melihat halaman “Selamat Datang” yang menampilkan pesan selamat datang dan pesan yang diteruskan dari Laravel.
Bekerja dengan Data dan Formulir
Inertia.js menyederhanakan bekerja dengan data dan formulir. Mari kita lihat beberapa contoh:
Mengambil Data dari Database
Untuk mengambil data dari database, Anda dapat menggunakan Eloquent ORM Laravel seperti biasa. Kemudian, Anda dapat meneruskan data ke komponen front-end Anda sebagai props.
- Buat Model dan Migrasi:
Buat model
Product
dan migrasi terkait:php artisan make:model Product -m
Modifikasi file migrasi untuk menambahkan kolom yang sesuai ke tabel
products
. - Implementasikan Model:
Buka
app/Models/Product.php
dan implementasikan modelProduct
. - Ambil Data di Controller:
Buat controller untuk mengelola data produk:
php artisan make:controller ProductController
Buka
app/Http/Controllers/ProductController.php
dan tambahkan metodeindex
untuk mengambil semua produk dari database dan meneruskannya ke komponen Vue.js:use App\Models\Product; use Inertia\Inertia; class ProductController extends Controller { public function index() { $products = Product::all(); return Inertia::render('Products/Index', [ 'products' => $products, ]); } }
- Buat Komponen Vue.js:
Buat file
resources/js/Pages/Products/Index.vue
untuk menampilkan daftar produk:<template> <div> <h1>Daftar Produk</h1> <ul> <li v-for="product in products" :key="product.id"> {{ product.name }} - {{ product.price }} </li> </ul> </div> </template> <script> export default { props: { products: { type: Array, required: true, }, }, }; </script>
- Tambahkan Route:
Tambahkan route ke
routes/web.php
untuk mengakses halaman daftar produk:use App\Http\Controllers\ProductController; Route::get('/products', [ProductController::class, 'index']);
Menangani Formulir
Inertia.js menyederhanakan penanganan formulir. Anda dapat mengirim data formulir ke server menggunakan metode Inertia.post()
, Inertia.put()
, atau Inertia.delete()
.
- Buat Komponen Vue.js untuk Formulir:
Buat file
resources/js/Pages/Products/Create.vue
untuk menampilkan formulir pembuatan produk:<template> <div> <h1>Buat Produk Baru</h1> <form @submit.prevent="handleSubmit"> <div> <label for="name">Nama:</label> <input type="text" id="name" v-model="form.name"> <div v-if="errors.name" class="error">{{ errors.name[0] }}</div> </div> <div> <label for="price">Harga:</label> <input type="number" id="price" v-model="form.price"> <div v-if="errors.price" class="error">{{ errors.price[0] }}</div> </div> <button type="submit">Buat</button> </form> </div> </template> <script> import { useForm } from '@inertiajs/vue3'; export default { setup() { const form = useForm({ name: '', price: '', }); const handleSubmit = () => { form.post('/products'); }; return { form, handleSubmit }; }, props: { errors: Object, }, }; </script>
- Buat Route dan Controller:
Tambahkan route ke
routes/web.php
untuk menampilkan formulir dan memproses data formulir:use App\Http\Controllers\ProductController; use Illuminate\Support\Facades\Route; Route::get('/products/create', [ProductController::class, 'create']); Route::post('/products', [ProductController::class, 'store']);
Buka
app/Http/Controllers/ProductController.php
dan tambahkan metodecreate
danstore
:use App\Models\Product; use Illuminate\Http\Request; use Inertia\Inertia; class ProductController extends Controller { public function create() { return Inertia::render('Products/Create'); } public function store(Request $request) { $request->validate([ 'name' => 'required', 'price' => 'required|numeric', ]); Product::create($request->all()); return redirect('/products'); } }
Shared Data
Inertia.js memungkinkan Anda untuk berbagi data antara server dan client secara otomatis. Ini berguna untuk berbagi data yang sering digunakan di seluruh aplikasi Anda, seperti informasi pengguna yang diautentikasi, pengaturan konfigurasi, atau pesan flash.
- Konfigurasi Shared Data:
Buka
app/Providers/AppServiceProvider.php
dan tambahkan kode berikut ke metodeboot
:use Illuminate\Support\Facades\Session; use Inertia\Inertia; public function boot() { Inertia::share([ 'errors' => function () { return Session::get('errors') ? Session::get('errors')->getBag('default')->getMessages() : (object) []; }, 'flash' => function () { return [ 'success' => Session::get('success'), 'error' => Session::get('error'), ]; }, 'auth' => [ 'user' => auth()->user() ? [ 'id' => auth()->user()->id, 'name' => auth()->user()->name, 'email' => auth()->user()->email, ] : null, ], ]); }
- Akses Shared Data di Komponen Vue.js:
Anda dapat mengakses shared data di komponen Vue.js Anda menggunakan properti
$page.props
:<template> <div> <h1>Halo, {{ $page.props.auth.user.name }}!</h1> </div> </template>
Keuntungan Menggunakan Inertia.js
Berikut adalah beberapa keuntungan utama menggunakan Inertia.js:
- Produktivitas yang Ditingkatkan: Inertia.js menyederhanakan alur kerja pengembangan Anda, memungkinkan Anda untuk fokus pada logika bisnis dan antarmuka pengguna tanpa terbebani oleh kompleksitas routing API dan pengambilan data sisi klien.
- Performa yang Lebih Baik: Pendekatan “tanpa API” dari Inertia.js menghasilkan pengalaman pengguna yang lebih cepat dan lebih responsif.
- SEO-Friendly: Rendering sisi server awal memastikan bahwa aplikasi Anda mudah diindeks oleh mesin pencari.
- Kode yang Lebih Bersih dan Lebih Mudah Dipelihara: Inertia.js mendorong arsitektur yang bersih dan terstruktur, yang mengarah pada kode yang lebih mudah dipelihara dan dikembangkan.
- Reusable Components: Inertia.js memungkinkan Anda untuk membangun komponen front-end yang dapat digunakan kembali di seluruh aplikasi Anda, mempromosikan konsistensi dan mengurangi duplikasi kode.
Kesimpulan
Inertia.js adalah alat yang ampuh yang dapat membantu Anda membangun aplikasi web modern dan interaktif dengan Laravel. Dengan menyederhanakan alur kerja pengembangan Anda, meningkatkan performa, dan mempromosikan kode yang bersih dan mudah dipelihara, Inertia.js dapat membantu Anda untuk memberikan pengalaman pengguna yang luar biasa.
Dalam panduan ini, kita telah menjelajahi Inertia.js secara mendalam, memahami konsep intinya, dan mempelajari cara menggunakannya untuk membangun aplikasi web yang kuat dan efisien. Kami telah membahas cara menyiapkan proyek Laravel dengan Inertia.js, membuat halaman pertama Anda, bekerja dengan data dan formulir, dan berbagi data antara server dan client.
Dengan pengetahuan ini, Anda siap untuk mulai membangun aplikasi web modern Anda sendiri dengan Laravel dan Inertia.js!
“`