Belajar Laravel 13 #6: Controller, Request Validation & CRUD

Heru Iryanto
Heru Iryanto
Teacher, Content Creator and Full-Stack Developer

Di materi Struktur Modern dan Routing, kita menjejalkan perintah untuk memunculkan teks (return "Halo") langsung di dalam file routes/web.php. Cara ini sangat terlarang di industri! Rute (Satpam) tugasnya hanya membaca alamat, bukan mengeksekusi logika berat. Logika eksekusi (seperti menyimpan data form atau memeriksa password) harus diserahkan ke huruf ‘C’ dari MVC, yaitu Controller (Sang Pelayan).

1️⃣ Read (Membaca)

Sebelum kita membaca / menampilkan isi database, kita akan berkenalan dulu dengan Controller dan melakukan operasi Read menggunakan Controller.

Controller adalah bagian dari MVC yang bertugas untuk menangani logika bisnis aplikasi. Controller bertugas untuk menerima permintaan dari pengguna, memprosesnya, dan mengembalikan hasil ke pengguna. Controller juga bisa memanggil Model untuk mengambil data dari database atau melakukan operasi lainnya.

1.1. Membuat Controller

Gunakan terminal artisan untuk mempekerjakan Pelayan baru yang khusus mengurusi urusan Artikel:

php artisan make:controller ArtikelController

(File akan terbentuk di app/Http/Controllers/ArtikelController.php)

Mari buka filenya, dan buat aksi-aksi (Method) standar di dalamnya:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Artikel; // Jangan lupa panggil Model!

class ArtikelController extends Controller
{
    // Aksi 1: Menampilkan Halaman Tabel Semua Berita
    public function index() {
        $semua_data = Artikel::all(); // Model Bekerja
        return view('artikel.index', ['berita' => $semua_data]); // View Bekerja
    }
}

1.2. Membuat View dan Layout untuk Artikel

Di folder views, buat layout untuk artikel artikel_layout.blade.php yang berisi :

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>@yield('title', 'Artikel')</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 text-gray-800 min-h-screen">
    <header class="bg-white shadow-sm">
        <div class="max-w-4xl mx-auto px-4 py-6">
            <h1 class="text-2xl md:text-3xl font-bold">@yield('title', 'Judul Artikel')</h1>
        </div>
    </header>

    <main class="max-w-4xl mx-auto px-4 py-8">
        <article class="bg-white rounded-xl shadow p-6 md:p-8 prose max-w-none">
            @yield('content')
        </article>
    </main>

</body>
</html>

Kemudia buat folder artikel di dalam folder views. Buat file index.blade.php di dalam folder artikel dengan kode sebagai berikut :

@extends('artikel_layout')

@section('title', 'Belajar Laravel untuk Pemula')

@section('content')
    <h1 class="text-3xl font-bold mb-4">Daftar Artikel</h1>
    <table class="min-w-full bg-white border border-gray-300 rounded-lg overflow-hidden">
        <thead class="bg-gray-100">
            <tr>
                <th class="px-6 py-3 text-left text-sm font-medium text-gray-700">ID</th>
                <th class="px-6 py-3 text-left text-sm font-medium text-gray-700">Judul</th>
                <th class="px-6 py-3 text-left text-sm font-medium text-gray-700">Isi</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($berita as $artikel)
                <tr class="border-t border-gray-200">
                    <td class="px-6 py-4 whitespace-nowrap">{{ $artikel->id }}</td>
                    <td class="px-6 py-4 whitespace-nowrap">{{ $artikel->judul }}</td>
                    <td class="px-6 py-4 whitespace-nowrap">{{ \Illuminate\Support\Str::limit($artikel->konten, 10) }}</td>
                </tr>
            @endforeach
        </tbody>
@endsection

1.3. Merangkai Kabel antara Rute ke Controller:

Sekarang, mari ubah satpam Anda di routes/web.php agar melemparkan tanggung jawabnya ke pelayan.

use App\Http\Controllers\ArtikelController; // Panggil Marga Pelayan

// "Jika pengunjung ketik /beranda, lempar tugasnya ke method index milik Pelayan!"
Route::get('/artikel', [ArtikelController::class, 'index']);

1.4. Test di Browser

Jalankan php artisan serve, lalu buka browser Anda dan ketik alamat:

http://localhost:8000/artikel

Anda akan melihat halaman yang menampilkan judul “Daftar Artikel” dan seluruh isi tabel yang sudah dibuat menggunakan seeding sebelumnya.

2️⃣ Menggenggam Kiriman Form (Request Handling)

Di PHP kuno, jika pengunjung menekan tombol Simpan di Form HTML, Anda menangkap lemparan isian teksnya menggunakan variabel gaib $_POST['judul']. Hal ini dihapus total di Framework PHP Modern! Anda harus menggunakan fitur Dependency Injection bernama Request $request.

Tambahkan Method store() (Simpan) di dalam ArtikelController:

// Aksi 3: Menangkap Jala dari Lemparan Form HTML
// Parameter sakti Request $request (Keranjang Belanja) digunakan untuk menampung seluruh kotak inputan
public function store(Request $request) {
    
    // Tarik isian ketikan user menggunakan panah ->nama_kotak
    $judul_ketikan = $request->judul;
    $isi_ketikan   = $request->konten_berita;

    // Suruh Model Menyimpannya
    $baru = new Artikel();
    $baru->judul = $judul_ketikan;
    $baru->isi_berita = $isi_ketikan;
    $baru->save();

    // Jika sukses, kembalikan secara elegan ke Rute Awal
    return redirect('/beranda');
}

Rute untuk menangkap form tersebut di web.php BUKAN menggunakan Route::get, melainkan Route::post!

Route::post('/simpan', [ArtikelController::class, 'store']);

3️⃣ Filter Validasi (Mencegah Kehancuran Data)

Apa yang terjadi jika pengunjung SENGAJA TIDAK MENGISI APA-APA (KOSONG) lalu langsung memencet tombol Simpan? Sistem akan Error!

Kita butuh Validasi. Di PHP murni, Anda akan menggunakan if (empty($_POST['judul'])) { return error... }. Sangat bertele-tele. Di Laravel, gunakan filter validate(). Ini sangat menakjubkan.

Modifikasi method store() Anda tadi:

public function store(Request $request) {
    
    // BANGUN DINDING PERTAHANAN VALIDASI!
    // "Hai Laravel, periksa kotak 'judul' dan 'isi_berita'."
    // Aturannya: WAJIB DIISI (required) dan minimal harus 5 Huruf (min:5).
    $request->validate([
        'judul' => 'required|min:5',
        'konten_berita' => 'required'
    ]);

    // ---- AMAN! ----
    // Jika validasi GAGAL, sistem OTOMATIS menendang balik pengunjung ke halaman 
    // Form tadi dan memunculkan tulisan merah Error di bawah kotak form.
    // Jika SUKSES (Lolos filter), barulah eksekusi kode di bawah ini berjalan:
    
    $baru = new Artikel();
    $baru->judul = $request->judul;
    // ...
    // ...
}

🗽 Kesimpulan

Jika Anda telah menguasai tiga pilar ini: Mendaftarkan Rute (Route), Mengeksekusi Logika Pelayan (Controller), dan Memfilter Kekosongan Data (Validation), Anda secara teori sudah menguasai 80% alur kerja Back-End Laravel sehari-hari.

Bahkan sistem raksasa seperti Tokopedia dan Gojek pun fondasi intinya hanyalah rute Rute, Controller, dan Validasi.

Sekarang arsitektur MVC kita telah sempurna! Namun, Anda belum memiliki sistem keanggotaan pengguna (User System). Membangun sistem Login, Register, dan Lupa Sandi sendiri akan menghabiskan waktu seminggu. Bagaimana jika Laravel bisa melakukannya untuk Anda dalam kurang dari 10 detik dan sudah digabungkan secara gaib dengan kekuatan desain Tailwind CSS Bab sebelumnya? Temukan senjata nuklirnya di Bab 7: Autentikasi Instan (Laravel Breeze).