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.)
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
Tentukan pintu (URL + cara ketuk)
GET /api/bukuuntuk daftar;GET /api/buku/{id}untuk satu item. -
2
Siapkan data sebagai array/object Sama seperti array PHP di jembatan OOP — belum perlu database di artikel ini.
-
3
Kirim JSON, bukan HTML
response()->json(...)mengurus header yang bilang “ini JSON” (sering disebut Content-Type). -
4
Pakai status yang jujur Ketemu -> 200. Tidak ketemu -> 404. Jangan selalu 200 dengan pesan bohong.
-
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
- Di demo PHP, tambah buku id
3dan pastikan daftar memuat 3 item. - Ubah simulasi id
99menjadi id1dan pastikan output menampilkan judul buku (bukan pesan 404). - Di cuplikan Laravel, tulis route
GET /api/pingyang 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.