Seri Belajar Laravel: Part 1 — Setup & Halaman Pertama  →  Part 2 — Controller  →  Part 3 — Database & Migration

Di Part 1, kamu sudah bisa membuat route dan view. Semua logika ditulis langsung di routes/web.php. Untuk project kecil itu tidak masalah, tapi begitu project membesar, file route akan penuh sesak dengan logika bisnis yang seharusnya tidak ada di sana.

Controller adalah solusinya. Controller adalah file PHP khusus tempat kamu menaruh logika — mengambil data, memproses request, lalu memutuskan view apa yang ditampilkan. Route cukup menunjuk ke controller.

Analogi: Restoran

Bayangkan restoran:

Tanpa controller, pelayan (route) harus masak sendiri di tempat — kacau. Dengan controller, tanggung jawab jelas terpisah.

📋 Progress Belajarmu

① Buat Controller

Buka terminal di VS Code (pastikan kamu sudah di folder project) dan jalankan:

php artisan make:controller CatatanController

Laravel akan membuat file baru di app/Http/Controllers/CatatanController.php. Buka file tersebut:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CatatanController extends Controller
{
    //
}

Ini adalah controller kosong. Kamu akan menambahkan method (fungsi) di dalam class ini.

② Tambah Method ke Controller

Tambahkan method index untuk menampilkan daftar catatan:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CatatanController extends Controller
{
    public function index()
    {
        $catatan = [
            ['id' => 1, 'judul' => 'Beli sayuran', 'isi' => 'Bayam, wortel, tomat'],
            ['id' => 2, 'judul' => 'Belajar Laravel', 'isi' => 'Selesai sampai Part 3'],
            ['id' => 3, 'judul' => 'Olahraga', 'isi' => 'Lari 30 menit pagi hari'],
        ];

        return view('catatan.index', compact('catatan'));
    }
}
compact('catatan') adalah cara singkat untuk menulis ['catatan' => $catatan]. Variabel $catatan dikirim ke view dengan nama catatan.

③ Buat View untuk Catatan

Buat folder catatan di dalam resources/views/, lalu buat file index.blade.php di dalamnya:

resources/views/catatan/index.blade.php

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <title>Daftar Catatan</title>
    <style>
        body { font-family: sans-serif; max-width: 700px; margin: 40px auto; padding: 0 20px; }
        h1   { color: #0f766e; }
        .card { border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px; margin-bottom: 12px; }
        .card h3 { margin: 0 0 8px; color: #1e293b; }
        .card p  { margin: 0; color: #64748b; }
    </style>
</head>
<body>
    <h1>Daftar Catatan</h1>
    <p>Total: {{ count($catatan) }} catatan</p>

    @foreach ($catatan as $item)
        <div class="card">
            <h3>{{ $item['judul'] }}</h3>
            <p>{{ $item['isi'] }}</p>
        </div>
    @endforeach
</body>
</html>

④ Daftarkan Route → Controller

Buka routes/web.php dan tambahkan route yang mengarah ke Controller:

<?php

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

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

// Arahkan /catatan ke method index di CatatanController
Route::get('/catatan', [CatatanController::class, 'index']);

Buka http://localhost:8000/catatan di browser — daftar catatan akan tampil!

⑤ Route Parameter — Detail Satu Catatan

Tambahkan method show di CatatanController untuk menampilkan detail satu catatan berdasarkan ID:

public function show($id)
{
    // Sementara data masih hardcode
    $semuaCatatan = [
        1 => ['judul' => 'Beli sayuran',    'isi' => 'Bayam, wortel, tomat'],
        2 => ['judul' => 'Belajar Laravel', 'isi' => 'Selesai sampai Part 3'],
        3 => ['judul' => 'Olahraga',        'isi' => 'Lari 30 menit pagi hari'],
    ];

    // Kalau ID tidak ada, tampilkan 404
    if (!isset($semuaCatatan[$id])) {
        abort(404);
    }

    $catatan = $semuaCatatan[$id];

    return view('catatan.show', compact('catatan', 'id'));
}

Buat view-nya di resources/views/catatan/show.blade.php:

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <title>{{ $catatan['judul'] }}</title>
    <style>
        body { font-family: sans-serif; max-width: 700px; margin: 40px auto; padding: 0 20px; }
        a    { color: #0f766e; }
    </style>
</head>
<body>
    <a href="/catatan">← Kembali ke daftar</a>
    <h1>{{ $catatan['judul'] }}</h1>
    <p>{{ $catatan['isi'] }}</p>
</body>
</html>

Tambahkan route parameter di routes/web.php:

// {id} adalah parameter yang ditangkap dari URL
Route::get('/catatan/{id}', [CatatanController::class, 'show']);

Coba buka http://localhost:8000/catatan/1, /catatan/2, /catatan/3. Masing-masing tampil berbeda!

Update View Index — Tambah Link ke Detail

Supaya bisa klik dari daftar ke detail, update catatan/index.blade.php:

@foreach ($catatan as $item)
    <div class="card">
        <h3><a href="/catatan/{{ $item['id'] }}">{{ $item['judul'] }}</a></h3>
        <p>{{ $item['isi'] }}</p>
    </div>
@endforeach

Ringkasan Alur Controller

URL: GET /catatan/2
        ↓
routes/web.php: Route::get('/catatan/{id}', [CatatanController::class, 'show'])
        ↓
CatatanController@show($id = 2)
        ↓
return view('catatan.show', compact('catatan', 'id'))
        ↓
resources/views/catatan/show.blade.php ditampilkan ke browser

Langkah Selanjutnya

Sejauh ini data masih hardcode di dalam controller. Di Part 3 — Database & Migration, kita akan setup database sungguhan dan menyimpan catatan ke tabel. Data tidak hilang saat server di-restart!