Panduan Tutorial Laravel

Belajar Laravel Batch 5: CRUD Lengkap - Menguasai Operasi Data Aplikasi

Belajar Laravel Batch 5: CRUD Lengkap - Menguasai Operasi Data Aplikasi
Twitter / X WhatsApp Facebook LinkedIn Telegram
Apa yang kamu butuhkan

Di Batch 5 ini, PahamITian akan belajar membuat fitur CRUD (Create, Read, Update, Delete) secara lengkap untuk aplikasi Laravel. Kita akan membahas Route Resource, validasi input, menampilkan error, hingga pagination untuk mengelola data artikel dengan profesional.

Halo, PahamITian! Selamat datang kembali di petualangan Laravel kita!Setelah di Batch 4 kita berhasil mengelola database dengan Migration dan berinteraksi dengannya menggunakan Model Eloquent, sekarang saatnya kita "menghidupkan" aplikasi kita dengan fungsionalitas inti: CRUD Lengkap.

CRUD adalah singkatan dari Create, Read, Update, Delete. Ini adalah empat operasi dasar yang hampir selalu ada di setiap aplikasi web yang berinteraksi dengan data. Bayangkan, tanpa CRUD, kita tidak bisa menambah, melihat, mengubah, atau menghapus data artikel yang sudah kita buat. Di batch ini, kita akan membuat fitur CRUD yang komprehensif untuk artikel kita.

Apa itu CRUD Lengkap?

Sebelum masuk ke kode, mari kita pahami dulu apa saja operasi yang tercakup dalam CRUD:

  1. Create (Membuat): Proses untuk menambahkan data baru ke database.
  2. Read (Membaca): Proses untuk menampilkan data dari database.
  3. Update (Memperbarui): Proses untuk mengubah data yang sudah ada di database.
  4. Delete (Menghapus): Proses untuk menghilangkan data dari database.

Route Resource: Cara Cepat Membuat Banyak Route CRUD

PahamITian, bayangkan jika kita harus membuat 7 route berbeda untuk setiap operasi CRUD di atas? Pasti akan sangat merepotkan, kan? Untungnya, Laravel punya fitur keren bernama Route Resource.

Route Resource adalah cara Laravel untuk secara otomatis membuatkan sekumpulan route yang standar untuk operasi CRUD pada sebuah "sumber daya" (resource), seperti Post atau User.

Langkah 1: Buat Controller Resource

Kita sudah punya PostController dari batch sebelumnya. Jika belum, kita bisa membuatnya dengan opsi --resource:

BASH
php artisan make:controller PostController --resource

Perintah ini akan membuat PostController dengan 7 method kosong yang sesuai dengan operasi CRUD (index, create, store, show, edit, update, destroy).

Langkah 2: Daftarkan Route Resource

Buka file routes/web.php dan tambahkan baris ini:

PHP
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;

// ... route-route lainnya

Route::resource('posts', PostController::class);

Sekarang, coba jalankan perintah ini di terminal:

BASH
php artisan route:list

Voila! PahamITian akan melihat 7 route baru yang otomatis dibuat oleh Laravel, lengkap dengan method HTTP (GET, POST, PUT/PATCH, DELETE) dan nama route yang standar. Ini sangat menghemat waktu dan membuat kode lebih rapi!

Implementasi CRUD di PostController dan View

Sekarang, mari kita isi method-method di PostController kita. Kita akan menggunakan model Post yang sudah kita buat di Batch 4.

1. index(): Menampilkan Daftar Artikel

Method ini akan menampilkan semua artikel. Kita juga akan langsung menerapkan Pagination di sini agar daftar artikel tidak terlalu panjang jika datanya banyak.

PHP
// app/Http/Controllers/PostController.php

namespace App\Http\Controllers;

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

class PostController extends Controller
{
    public function index()
    {
        $posts = Post::latest()->paginate(10); // Ambil 10 artikel per halaman, urutkan terbaru
        return view('posts.index', compact('posts'));
    }

    // ... method lainnya
}

Apa itu Pagination?

Pagination adalah teknik untuk membagi daftar data yang panjang menjadi beberapa halaman. Ini penting untuk performa dan pengalaman pengguna. Dengan ->paginate(10), Laravel akan mengambil 10 data per halaman secara otomatis.

Untuk menampilkan link pagination di view, kita cukup menambahkan:

BLADE
{{-- resources/views/posts/index.blade.php --}}

{{-- ... tabel atau daftar artikel ... --}}

<div class="mt-4">
    {!! $posts->links() !!}
</div>

2. create(): Menampilkan Form Tambah Artikel

Method ini hanya akan menampilkan view yang berisi form untuk menambah artikel baru.

PHP
// app/Http/Controllers/PostController.php

    public function create()
    {
        return view('posts.create');
    }

    // ... method lainnya

3. store(): Menyimpan Artikel Baru (dengan Validasi)

Ini adalah method yang paling krusial untuk operasi 'Create'. Di sini, kita akan menerima data dari form dan menyimpannya ke database. Validasi Input sangat penting di sini untuk memastikan data yang masuk ke database sesuai dengan yang kita harapkan dan aman.

PHP
// app/Http/Controllers/PostController.php

    public function store(Request $request)
    {
        // Validasi Input
        $request->validate([
            'title' => 'required|min:5|max:255',
            'slug' => 'required|unique:posts',
            'content' => 'required'
        ]);

        Post::create($request->all());

        return redirect()->route('posts.index')->with('success', 'Artikel berhasil ditambahkan!');
    }

    // ... method lainnya

Apa itu Validasi Input?

Validasi Input adalah proses memeriksa apakah data yang dikirim oleh pengguna memenuhi kriteria tertentu sebelum diproses atau disimpan ke database. Misalnya, memastikan judul tidak kosong, slug unik, atau konten tidak kurang dari jumlah karakter tertentu. Laravel menyediakan cara yang sangat mudah untuk melakukan validasi.

Jika validasi gagal, Laravel akan otomatis mengembalikan pengguna ke halaman sebelumnya dengan pesan error dan input yang lama (flash data). Kita akan menampilkan error ini di view.

4. show(): Menampilkan Detail Artikel

Method ini akan menampilkan detail satu artikel berdasarkan ID atau slug-nya.

PHP
// app/Http/Controllers/PostController.php

    public function show(Post $post)
    {
        return view('posts.show', compact('post'));
    }

    // ... method lainnya

Perhatikan Post $post di parameter. Ini adalah fitur keren Laravel yang disebut Route Model Binding. Laravel secara otomatis akan mencari artikel dengan ID yang cocok dari URL dan menginjeksikannya sebagai objek Post ke method kita. Keren, kan?

5. edit(): Menampilkan Form Edit Artikel

Mirip dengan create(), tapi form ini akan diisi dengan data artikel yang ingin kita edit.

PHP
// app/Http/Controllers/PostController.php

    public function edit(Post $post)
    {
        return view('posts.edit', compact('post'));
    }

    // ... method lainnya

6. update(): Memperbarui Artikel (dengan Validasi)

Method ini menerima data dari form edit dan memperbarui artikel yang sudah ada di database. Validasi juga penting di sini.

PHP
// app/Http/Controllers/PostController.php

    public function update(Request $request, Post $post)
    {
        // Validasi Input (perhatikan 'slug' yang unique, tapi boleh sama dengan slug artikel ini sendiri)
        $request->validate([
            'title' => 'required|min:5|max:255',
            'slug' => 'required|unique:posts,slug,' . $post->id, // Abaikan slug artikel ini sendiri
            'content' => 'required'
        ]);

        $post->update($request->all());

        return redirect()->route('posts.index')->with('success', 'Artikel berhasil diperbarui!');
    }

    // ... method lainnya

7. destroy(): Menghapus Artikel

Method ini akan menghapus artikel dari database.

PHP
// app/Http/Controllers/PostController.php

    public function destroy(Post $post)
    {
        $post->delete();

        return redirect()->route('posts.index')->with('success', 'Artikel berhasil dihapus!');
    }
}

Menampilkan Error Validasi di Blade

Ketika validasi gagal, Laravel akan mengarahkan kembali ke form dengan pesan error. Kita bisa menampilkannya di Blade menggunakan directive @error.

BLADE
{{-- resources/views/posts/create.blade.php atau edit.blade.php --}}

<form action="{{ route('posts.store') }}" method="POST">
    @csrf
    <div>
        <label for="title">Judul Artikel:</label>
        <input type="text" name="title" id="title" value="{{ old('title') }}">
        @error('title')
            <div style="color: red;">{{ $message }}</div>
        @enderror
    </div>
    <div>
        <label for="slug">Slug:</label>
        <input type="text" name="slug" id="slug" value="{{ old('slug') }}">
        @error('slug')
            <div style="color: red;">{{ $message }}</div>
        @enderror
    </div>
    <div>
        <label for="content">Konten:</label>
        <textarea name="content" id="content">{{ old('content') }}</textarea>
        @error('content')
            <div style="color: red;">{{ $message }}</div>
        @enderror
    </div>
    <button type="submit">Simpan Artikel</button>
</form>

Fungsi old('field_name') sangat berguna untuk mempertahankan input pengguna di form setelah validasi gagal, sehingga pengguna tidak perlu mengetik ulang semuanya.

Ringkasan Singkat Batch 5

Di Batch 5 ini, PahamITian telah belajar:
* Mengenal 7 operasi CRUD lengkap (index, create, store, show, edit, update, destroy).
* Menggunakan Route Resource untuk membuat banyak route CRUD secara otomatis.
* Mengimplementasikan logika CRUD di PostController.
* Melakukan Validasi Input untuk menjaga kualitas dan keamanan data.
* Menampilkan pesan error validasi di Blade.
* Menerapkan Pagination untuk daftar data yang lebih efisien.

Latihan Praktik: Membuat CRUD Artikel Lengkap

Sekarang giliran PahamITian untuk mengaplikasikan semua yang sudah dipelajari:

  1. Pastikan PostController Anda dibuat dengan --resource atau tambahkan method-method CRUD yang kosong jika sudah ada.
  2. Daftarkan Route::resource('posts', PostController::class); di routes/web.php.
  3. Buat folder resources/views/posts.
  4. Buat file-file Blade berikut di dalam folder posts:
  5. Isi method-method di PostController sesuai dengan contoh di atas, termasuk validasi dan pagination.
  6. Uji coba semua operasi CRUD:

Pertanyaan Cek Pemahaman

Jawab pertanyaan-pertanyaan ini untuk memastikan PahamITian sudah paham konsepnya:

  1. Apa keuntungan utama menggunakan Route::resource dibandingkan mendefinisikan route satu per satu?
  2. Jelaskan perbedaan fungsi antara method create() dan store() dalam konteks CRUD.
  3. Mengapa validasi input sangat penting dalam pengembangan aplikasi web?
  4. Bagaimana cara menampilkan pesan error validasi untuk sebuah field di Blade?
  5. Apa itu Route Model Binding dan bagaimana cara kerjanya di Laravel?
  6. Kapan kita sebaiknya menggunakan pagination?

Kesalahan Umum Pemula

  • Lupa @csrf di form POST/PUT/DELETE: Ini akan menyebabkan error 419 Page Expired. Selalu ingat untuk menambahkannya!
  • Lupa use App\Models\Post; di PostController.
  • Salah nama route di route() helper: Pastikan nama route yang dipanggil (posts.index, posts.create, dll.) sesuai dengan output php artisan route:list.
  • Lupa fillable atau guarded di Model: Ini akan menyebabkan MassAssignmentException saat menggunakan Post::create($request->all()) atau $post->update($request->all()).
  • Tidak menampilkan error validasi: Pengguna akan bingung mengapa input mereka ditolak.

Persiapan untuk Batch Berikutnya

Selamat, PahamITian sudah menguasai operasi data inti! Di Batch 6, kita akan masuk ke topik yang lebih menarik lagi: Relasi Database Dasar. Kita akan belajar bagaimana menghubungkan tabel-tabel yang berbeda, misalnya, bagaimana satu artikel bisa memiliki satu kategori, atau satu user bisa memiliki banyak artikel. Ini akan membuat aplikasi kita jauh lebih powerful dan terstruktur!

(Catatan: Sumber eksternal perlu diverifikasi secara manual oleh admin.)