Pendahuluan — dari object PHP ke pintu HTTP

Di Visibility & Composition (#55) kamu sudah punya object Buku dan Katalog. Artikel ini adalah #56 (ini) — langkah pertama stack Laravel di Seri 4.

Ide barunya sederhana: orang (atau aplikasi) mengetuk alamat URL, Laravel memilih route (pintu), lalu menjawab dengan JSON (data rapi untuk komputer).

Awam: bayangkan loket perpustakaan. Pengunjung bilang “saya mau daftar buku” — itu URL. Petugas memilih loket yang tepat — itu route. Jawaban tertulis rapi di kertas data — itu JSON.

Prasyarat: sudah baca Visibility & Composition (#55) — paham class/object ringan. Domain tetap perpustakaan mini. Pakai Laravel 11+ — sintaks route & JSON di sini berlaku di versi modern.

Route — pintu yang dipilih dari URL

Istilah Arti awam Contoh di artikel ini
Route Aturan: “kalau URL ini dikunjungi, jalankan kode ini” GET /api/buku -> daftar buku
JSON Format teks yang mudah dibaca program (bukan halaman HTML) {"judul":"Belajar PHP"}
Status HTTP Kode singkat: sukses, tidak ketemu, salah, dll. 200 OK · 404 tidak ketemu
GET Cara mengetuk pintu: “minta data” (baca), bukan kirim form GET /api/buku

Jangan hafal semua status dulu. Cukup dua: 200 (berhasil) dan 404 (pintu/data tidak ada).

JSON dulu — tanpa framework

Kenapa belum langsung buka Laravel? Karena ide JSON + status HTTP bisa dirasakan dulu di PHP biasa. Kalau ide-nya sudah “klik”, cuplikan Laravel nanti terasa seperti bungkus yang sama — bukan sihir baru.

Sebelum Laravel, lihat ide JSON di PHP biasa:

<?php
$buku = [
    "judul" => "Belajar PHP",
    "tahun" => 2024,
];

header("Content-Type: application/json; charset=utf-8");
http_response_code(200);
echo json_encode($buku, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), PHP_EOL;

Output:

{
    "judul": "Belajar PHP",
    "tahun": 2024
}

Awam: json_encode mengubah array PHP menjadi teks JSON. Header bilang “ini JSON, bukan HTML”.

Kalau data tidak ada — status 404

Pintu yang benar tetap bisa menjawab “tidak ketemu” dengan jujur:

<?php
$id = 99;
$koleksi = [
    1 => ["judul" => "Belajar PHP", "tahun" => 2024],
];

header("Content-Type: application/json; charset=utf-8");

if (! isset($koleksi[$id])) {
    http_response_code(404);
    echo json_encode(["pesan" => "Buku tidak ditemukan"], JSON_UNESCAPED_UNICODE), PHP_EOL;
    exit;
}

http_response_code(200);
echo json_encode($koleksi[$id], JSON_UNESCAPED_UNICODE), PHP_EOL;

Output:

{"pesan":"Buku tidak ditemukan"}

(Status HTTP-nya 404 — di browser, buka panel Developer Tools; atau di terminal jalankan curl -i. Angka status itu yang dicari, bukan hanya teks JSON.)

URL diketuk -> route dipilih -> JSON dikirim Browser / curl GET /api/buku Laravel Route pintu HTTP JSON + status 200 atau 404
Route bukan “halaman web”. Ia adalah pintu yang menjawab data — sering berupa JSON.

Laravel — menulis pintu JSON

Di project Laravel, cuplikan tipikal (misalnya routes/api.php). File ini bukan dijalankan dengan php file.php — ia hidup di dalam project Laravel:

<?php
// Cuplikan Laravel (bukan file mandiri) — ide sama dengan demo JSON di atas.
use Illuminate\Support\Facades\Route;

Route::get('/api/buku', function () {
    return response()->json([
        ["judul" => "Belajar PHP", "tahun" => 2024],
        ["judul" => "Laravel Praktis", "tahun" => 2025],
    ]);
});

Awam:

  • Route::get(...) = “kalau ada yang GET ke URL ini…”
  • response()->json(...) = “jawab dengan JSON + header yang benar”
  • Default sukses biasanya status 200
<?php
// Cuplikan Laravel — satu buku atau 404.
use Illuminate\Support\Facades\Route;

Route::get('/api/buku/{id}', function (int $id) {
    $koleksi = [
        1 => ["judul" => "Belajar PHP", "tahun" => 2024],
    ];

    if (! isset($koleksi[$id])) {
        return response()->json(["pesan" => "Buku tidak ditemukan"], 404);
    }

    return response()->json($koleksi[$id]);
});

Argumen kedua 404 di response()->json(..., 404) mengatur status HTTP — sama ide-nya dengan http_response_code(404) di PHP biasa.

Pola Dasar — routing & JSON

  1. 1
    Tentukan pintu (URL + cara ketuk) GET /api/buku untuk daftar; GET /api/buku/{id} untuk satu item.
  2. 2
    Siapkan data sebagai array/object Sama seperti array PHP di jembatan OOP — belum perlu database di artikel ini.
  3. 3
    Kirim JSON, bukan HTML response()->json(...) mengurus header yang bilang “ini JSON” (sering disebut Content-Type).
  4. 4
    Pakai status yang jujur Ketemu -> 200. Tidak ketemu -> 404. Jangan selalu 200 dengan pesan bohong.
  5. 5
    Baru pikir validasi request Berikutnya: Request & Form Request (#57) — penjaga di pintu masuk supaya data kotor tidak masuk sembarangan.

Kode lengkap — laravel_routing_json_demo.php

Simpan dan jalankan: php laravel_routing_json_demo.php. Ini meniru jawaban API (JSON + status) tanpa server Laravel — supaya ide-nya terasa dulu.

Awam: baris mixed $data artinya “data bisa bermacam bentuk (array, teks, dll.)”. Tidak perlu dihafal; fokus ke kirimJson() yang mengurus status + JSON. array_values(...) hanya merapikan daftar jadi nomor urut 0, 1, 2… supaya JSON-nya berbentuk array daftar, bukan objek ber-id.

<?php
/**
 * Demo ide routing & JSON (Seri 4 #56).
 * Di Laravel, ide yang sama hidup di Route + response()->json.
 */

declare(strict_types=1);

function kirimJson(mixed $data, int $status = 200): void
{
    http_response_code($status);
    header("Content-Type: application/json; charset=utf-8");
    echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), PHP_EOL;
}

function demo(): void
{
    $koleksi = [
        1 => ["judul" => "Belajar PHP", "tahun" => 2024],
        2 => ["judul" => "Laravel Praktis", "tahun" => 2025],
    ];

    // Simulasi: daftar buku (200)
    echo "=== GET /api/buku ===", PHP_EOL;
    kirimJson(array_values($koleksi), 200);

    // Simulasi: tidak ketemu (404)
    echo "=== GET /api/buku/99 ===", PHP_EOL;
    kirimJson(["pesan" => "Buku tidak ditemukan"], 404);
}

demo();

Output yang diharapkan:

=== GET /api/buku ===
[
    {
        "judul": "Belajar PHP",
        "tahun": 2024
    },
    {
        "judul": "Laravel Praktis",
        "tahun": 2025
    }
]
=== GET /api/buku/99 ===
{
    "pesan": "Buku tidak ditemukan"
}

Kesalahan umum

Gejala Penyebab tipikal Perbaikan
Jawaban terlihat seperti HTML Mengembalikan halaman HTML / teks biasa Pakai response()->json(...)
Selalu status 200 padahal gagal Lupa argumen status response()->json(..., 404)
Route tidak ketemu URL atau cara ketuk (GET/POST) salah, atau daftar route masih tersimpan lama Cek path; php artisan route:list
Langsung loncat database Mau model database terlalu dini Rapatkan pintu JSON dulu (#56 (ini)), baru penyimpanan data nanti
Satu file route jadi gudang besar Semua logika ditumpuk di dalam file route Nanti pecah ke controller — mulai dari pintu yang tipis

Latihan singkat

  1. Di demo PHP, tambah buku id 3 dan pastikan daftar memuat 3 item.
  2. Ubah simulasi id 99 menjadi id 1 dan pastikan output menampilkan judul buku (bukan pesan 404).
  3. Di cuplikan Laravel, tulis route GET /api/ping yang mengembalikan {"ok":true}.

FAQ singkat

Harus install Laravel dulu?
Untuk memahami ide: demo PHP di atas sudah cukup. Untuk latihan framework: buat project Laravel 11+ lalu tempel cuplikan route.

Kenapa JSON, bukan HTML?
API biasanya dilayani ke aplikasi lain (mobile, frontend, IoT). JSON lebih mudah diparse program daripada halaman penuh.

Apa bedanya routes/web.php dan routes/api.php?
Secara awam: web sering untuk halaman + login/sesi di browser; api untuk JSON ke aplikasi lain. Lapisan pengaman tambahan (sering disebut middleware) menyusul — fokus dulu: ada pintu, ada jawaban JSON.

Lanjut ke mana?
Berikutnya: Request & Form Request (#57) — penjaga di pintu masuk supaya data kotor tidak masuk sembarangan.

Kesimpulan & langkah berikutnya

Route = pintu. JSON = isi jawaban. Status = kejujuran sukses/gagal. Tiga ide ini yang membuat API perpustakaan bisa diajak bicara dari luar.

Artikel ini adalah #56 (ini) — pembuka Laravel setelah Visibility & Composition (#55) menutup jembatan OOP PHP.

Seri 4 progress: langkah #56 (ini) · 6/8 menuju Capstone Laravel · stack Laravel 1/5 · prasyarat: Visibility & Composition (#55) LIVE. Berikutnya: Request & Form Request (#57) — penjaga input di pintu HTTP.