Tutorial Laravel 12 – Membuat Web Berita berbasis API – Bagian #1 (Backend Laravel dan Frontend Vue.js)

Materi ini cocok untuk membangun aplikasi web modern menggunakan Laravel sebagai Backend (API) dan Vue.js sebagai Frontend, terhubung dengan database MySQL.


Gambaran Arsitektur

[ Vue.js (Frontend) ]  --->  [ Laravel (REST API) ]  --->  [ MySQL Database ]
        Axios                 Controller / Model             Tabel
  • Vue.js: tampilan & interaksi user
  • Laravel: logika bisnis & API
  • Database: penyimpanan data

Studi Kasus

Kita akan membuat Aplikasi Manajemen Berita Sederhana:

  • CRUD Berita (Create, Read, Update, Delete)
  • Backend: Laravel API
  • Frontend: Vue.js

Tabel: beritas

  • id
  • judul
  • isi
  • created_at
  • updated_at

BAGIAN A — BACKEND (Laravel)

1. Instalasi Laravel

composer create-project laravel/laravel api-berita
cd api-berita
php artisan serve

Akses:

http://127.0.0.1:8000

2. Konfigurasi Database

Edit file .env

DB_DATABASE=db_berita
DB_USERNAME=root
DB_PASSWORD=

Buat database db_berita di phpMyAdmin.


3. Membuat Migration

php artisan make:migration create_beritas_table

Edit file migration:

    public function up(): void
    {
        Schema::create('beritas', function (Blueprint $table) {
        $table->id();
        $table->string('judul');
        $table->text('isi');
        $table->timestamps();
        });
    }

Jalankan:

php artisan migrate

4. Membuat Model

php artisan make:model Berita

app/Models/Berita.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Berita extends Model
{
    protected $fillable = ['judul', 'isi'];
}

5. Membuat Controller API

php artisan make:controller Api/BeritaController

Isi controller:

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
//use App\Http\Controllers\Api\BeritaController;

use Illuminate\Http\Request;
use App\Models\Berita;

class BeritaController extends Controller
{
    public function index() {
    return Berita::all();
    }

    public function store(Request $request) {
        return Berita::create($request->all());
    }

    public function show($id) {
        return Berita::find($id);
    }

    public function update(Request $request, $id) {
        $berita = Berita::find($id);
        $berita->update($request->all());
        return $berita;
    }

    public function destroy($id) {
        return Berita::destroy($id);
    }
}


6. Routing API

Routing API di routes/web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\BeritaController;

Route::get('/', function () {
    return view('welcome');
});

Route::prefix('api')->group(function () {
    Route::apiResource('berita', BeritaController::class);
});

Hasil endpoint: php artisan route:list

GET    /api/berita
POST   /api/berita
GET    /api/berita/{id}
PUT    /api/berita/{id}
DELETE /api/berita/{id}

BAGIAN B — FRONTEND (Vue.js)

7. Instalasi Vue.js (Vite)

npm create vite@latest vue-berita
cd vue-berita
npm install
npm run dev

✅ Pilihan yang DISARANKAN (Pemula / Kelas Laravel + Vue)

Saat muncul pilihan seperti ini di npm create vite@latest vue-berita, PILIH SEPERTI INI:

✔ Vue
✔ JavaScript
✖ TypeScript
✖ JSX Support
✔ Router (SPA development)
✖ Pinia (state management)
✖ Vitest (unit testing)
✖ End-to-End Testing
✖ Linter
✖ Prettier

Router (SPA development) → ✅ WAJIB

Kenapa?

  • Hampir semua web modern butuh halaman:
    • /login
    • /berita
    • /dashboard
  • Sangat relevan dengan Laravel API

8. Install Axios

👉 install di folder vue-berita, BUKAN di root Laravel.

npm install axios

Struktur project kita sekarang kira-kira seperti ini:

project/
├─ api-berita/      ← Laravel (Backend)
│  └─ composer.json
│
├─ vue-berita/      ← Vue + Vite (Frontend)
│  ├─ package.json
│  └─ node_modules/

🔹 Axios itu milik siapa?

  • Axios = library JavaScript
  • Dipakai oleh Vue (Frontend)
  • Didaftarkan di package.json milik Vue

9. Struktur Komponen

src/
 ├─ components/
 │   └─ Berita.vue
 ├─ App.vue

10. Komponen Berita.vue

<script setup>
import { ref, onMounted } from 'vue'
import axios from 'axios'

const beritas = ref([])
const judul = ref('')
const isi = ref('')

const loadData = async () => {
  const res = await axios.get('http://127.0.0.1:8000/api/berita')
  beritas.value = res.data
}

const simpan = async () => {
  await axios.post('http://127.0.0.1:8000/api/berita', {
    judul: judul.value,
    isi: isi.value
  })
  judul.value = ''
  isi.value = ''
  loadData()
}

onMounted(loadData)
</script>

<template>
  <h2>Manajemen Berita</h2>

  <input v-model="judul" placeholder="Judul" />
  <textarea v-model="isi" placeholder="Isi"></textarea>
  <button @click="simpan">Simpan</button>

  <ul>
    <li v-for="b in beritas" :key="b.id">
      <b>{{ b.judul }}</b><br />
      {{ b.isi }}
    </li>
  </ul>
</template>

11. Gunakan di App.vue

<template>
  <Berita />
</template>

<script setup>
import Berita from './components/Berita.vue'
</script>

BAGIAN C — Integrasi & Testing

12. Jalankan Server

  • Laravel:
php artisan serve
  • Vue:
npm run dev

Buka Vue → data tersimpan ke database via Laravel API.


🔴 Jika Muncul Masalah tidak bisa submit

POST /api/berita → 419 (unknown status)

👉 419 = CSRF TOKEN ERROR

Laravel menganggap request kamu sebagai request web, padahal itu API dari Vue.

Kenapa Ini Terjadi (Versi Mudah Dipahami)

  • Laravel 12 → semua route ada di web.php
  • web.php otomatis pakai middleware CSRF
  • Vue tidak mengirim CSRF token
  • Laravel menolak → 419

✅ SOLUSI RESMI & BENAR (Laravel 12+)

🔧 Langkah 1 — Buka file:

bootstrap/app.php

🔧 Langkah 2 — Cari bagian withMiddleware

Biasanya seperti ini:

->withMiddleware(function (Middleware $middleware) {
    //
})

🔧 Langkah 3 — Tambahkan CSRF Exception untuk API

Ubah jadi seperti ini:

use Illuminate\Foundation\Configuration\Middleware;

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'api/*',
    ]);
})

SELESAI


🔄 Langkah 4 — Restart Server (WAJIB)

php artisan serve

Refresh Vue → coba POST lagi
👉 Error 419 akan HILANG

Tags :

Leave a Reply

Your email address will not be published. Required fields are marked *

sixteen − 15 =

Tutorial Terpopuler

Tutorial Pilihan

Tentang Gurututorku

Gurututorku adalah sebuah kursus online maupun offline yang menyediakan berbagai macam tutorial tentang pemrograman, design, dan multimedia serta artikel teknologi yang tentunya bisa dinikmati dan dipelajari oleh semua orang yang baru ingin belajar dunia IT.

© 2024 – Gurututorku.com | Learning today success tomorrow.