Sebelum membaca kode Laravel lebih jauh, kita perlu berkenalan dengan struktur data yang paling sering muncul di framework ini: associative array. Berbeda dengan array berindeks angka yang kita bahas di chapter Array, associative array memakai kunci bertipe string untuk mengakses nilainya. Laravel memakai struktur ini hampir di semua tempat — berkas config, aturan validasi, opsi route group, hingga hasil json_decode(). Membaca associative array dengan lancar berarti membaca sebagian besar berkas Laravel.

Array Kunci => Nilai #

Associative array dibuat dengan notasi 'kunci' => nilai, dan setiap elemen diakses lewat kuncinya, bukan lewat posisi angka. Mari kita lihat bentuk paling dasarnya:

php
<?php
$artikel = [
    'judul' => 'Belajar Laravel',
    'penulis' => 'Budi',
    'jumlah_kata' => 850,
];

echo $artikel['judul'] . "\n";
echo $artikel['penulis'] . "\n";
echo $artikel['jumlah_kata'] . "\n";

$artikel['jumlah_kata'] += 150;
echo $artikel['jumlah_kata'] . "\n";

Output yang Dihasilkan:

text
Belajar Laravel
Budi
850
1000

Baris $artikel['jumlah_kata'] += 150; membaca nilai lama (850), menjumlahkannya dengan 150, lalu menimpa nilai pada kunci yang sama. Kunci yang belum pernah dipakai bisa diberi nilai kapan saja — PHP cukup menambahkan pasangan kunci-nilai baru ke dalam array.

Array Bersarang #

Nilai sebuah kunci boleh berupa array lain. Struktur bersarang seperti ini adalah bentuk asli hampir semua berkas konfigurasi Laravel, misalnya config('database.connections') yang berisi array koneksi di dalam array connections.

php
<?php
$tugas = [
    'judul' => 'Migrasi Database',
    'status' => 'selesai',
    'penerima' => [
        'nama' => 'Siti',
        'email' => '[email protected]',
        'peran' => ['developer', 'reviewer'],
    ],
];

echo $tugas['penerima']['nama'] . "\n";
echo $tugas['penerima']['peran'][1] . "\n";

foreach ($tugas['penerima']['peran'] as $peran) {
    echo "- peran: {$peran}\n";
}

Output yang Dihasilkan:

text
Siti
reviewer
- peran: developer
- peran: reviewer

Perhatikan bahwa perjalanan menuju nilai ditulis berurutan dari luar ke dalam: $tugas['penerima']['peran'][1] membaca array $tugas, lalu array pada kunci penerima, lalu array pada kunci peran, dan akhirnya indeks 1.

Iterasi dengan foreach #

Untuk associative array, foreach memakai bentuk as $kunci => $nilai agar kita mendapatkan kedua sisi pasangan. Pola ini persis seperti yang dipakai Laravel saat memproses aturan validasi kolom demi kolom:

php
<?php
$artikel = [
    'judul' => 'Belajar Laravel',
    'penulis' => 'Budi',
    'jumlah_kata' => 850,
];

foreach ($artikel as $kunci => $nilai) {
    echo "{$kunci}: {$nilai}\n";
}

$aturan = [
    'judul' => 'required|min:5',
    'penulis' => 'required',
];

foreach ($aturan as $kolom => $aturanKolom) {
    echo "Kolom {$kolom} -> {$aturanKolom}\n";
}

Output yang Dihasilkan:

text
judul: Belajar Laravel
penulis: Budi
jumlah_kata: 850
Kolom judul -> required|min:5
Kolom penulis -> required

Array $aturan pada blok kedua bukan contoh karangan — bentuk tersebut adalah format asli yang diterima method Validator::make() di Laravel.

Memeriksa Kunci Sebelum Membacanya #

Membaca kunci yang tidak ada memicu warning Undefined array key, sehingga kita perlu memeriksa keberadaannya lebih dulu. PHP menyediakan dua fungsi dengan perilaku berbeda:

php
<?php
$pengguna = [
    ['id' => 1, 'nama' => 'Budi', 'email' => '[email protected]'],
    ['id' => 2, 'nama' => 'Siti', 'email' => '[email protected]'],
];

foreach ($pengguna as $p) {
    if (isset($p['email'])) {
        echo "Email {$p['nama']}: {$p['email']}\n";
    }
}

$konfigurasi = ['driver' => 'sqlite', 'prefix' => null];

var_dump(isset($konfigurasi['prefix']));
var_dump(array_key_exists('prefix', $konfigurasi));

Output yang Dihasilkan:

text
Email Budi: [email protected]
Email Siti: [email protected]
bool(false)
bool(true)

Perbedaan keduanya terletak pada nilai null: isset() mengembalikan false untuk kunci yang ada tetapi bernilai null, sedangkan array_key_exists() tetap mengembalikan true. Untuk konfigurasi Laravel yang sering memakai null sebagai nilai kosong, perbedaan ini penting diingat.

PemeriksaanKunci tidak adaKunci ada, nilai nullKunci ada, nilai terisi
isset($a['k'])falsefalsetrue
array_key_exists('k', $a)falsetruetrue

Ekstraksi dan Transformasi Cepat #

Dua fungsi bawaan sering muncul di kode framework: array_column() untuk mengambil satu kolom dari array of arrays, dan compact() untuk membungkus variabel-variabel lokal menjadi satu associative array berdasarkan nama variabelnya.

php
<?php
$tugas = [
    ['id' => 1, 'judul' => 'Migrasi Database', 'status' => 'selesai'],
    ['id' => 2, 'judul' => 'Menulis Tes Fitur', 'status' => 'berjalan'],
    ['id' => 3, 'judul' => 'Deploy Produksi', 'status' => 'berjalan'],
];

$judul = array_column($tugas, 'judul', 'id');
print_r($judul);

Output yang Dihasilkan:

text
Array
(
    [1] => Migrasi Database
    [2] => Menulis Tes Fitur
    [3] => Deploy Produksi
)

Parameter ketiga ('id') membuat kunci hasil diambil dari kolom tersebut. Fungsi kedua yang sering muncul di kode framework adalah compact(): fungsi ini membungkus variabel-variabel lokal menjadi satu associative array berdasarkan nama variabelnya. Kebalikannya, extract(), memasukkan setiap elemen array menjadi variabel lokal. Laravel memakai extract() secara internal saat menyiapkan data untuk view, tetapi kita perlu menghindari extract() di kode aplikasi kita sendiri karena fungsi tersebut bisa menimpa variabel yang sudah ada secara diam-diam:

php
<?php
$nama = 'Budi';
$email = '[email protected]';
$peran = 'editor';

$konteks = compact('nama', 'email', 'peran');
print_r($konteks);

Output yang Dihasilkan:

text
Array
(
    [nama] => Budi
    [email] => [email protected]
    [peran] => editor
)

Bolak-Balik JSON #

Karena bentuknya kunci-nilai, associative array terkonversi alami ke JSON dan sebaliknya. Inilah jembatan antara PHP dan response API. Kuncinya ada pada parameter kedua json_decode(): tanpa true kita menerima stdClass, dengan true kita menerima associative array.

php
<?php
$artikel = [
    'judul' => 'Belajar Laravel',
    'penulis' => 'Budi',
    'tag' => ['php', 'laravel'],
];

$json = json_encode($artikel);
echo $json . "\n";

$kembali = json_decode($json, true);
echo $kembali['tag'][1] . "\n";
echo gettype($kembali['tag']) . "\n";

Output yang Dihasilkan:

text
{"judul":"Belajar Laravel","penulis":"Budi","tag":["php","laravel"]}
laravel
array

Wujud Associative Array di Laravel #

Berkas konfigurasi Laravel hanyalah skrip PHP yang me-return associative array. Potongan berikut diambil langsung dari config/services.php sebuah proyek Laravel 13:

php
<?php

return [

    'postmark' => [
        'key' => env('POSTMARK_API_KEY'),
    ],

    'resend' => [
        'key' => env('RESEND_API_KEY'),
    ],

];

Begitu dibaca Laravel, array tersebut bisa diakses lewat helper config('services.postmark.key') — perjalanan kunci bertitik dari luar ke dalam, persis seperti array bersarang yang kita bahas di atas.

Aturan validasi juga berbentuk associative array, dan hasil validasi yang lolos dikembalikan sebagai associative array oleh $request->validated() atau $validator->validated(). Kode berikut dijalankan pada sandbox Course ini:

php
<?php

use Illuminate\Support\Facades\Validator;

$aturan = [
    'judul' => 'required|min:5',
    'penulis' => 'required|email',
];

$validator = Validator::make([
    'judul' => 'Belajar Laravel',
    'penulis' => '[email protected]',
], $aturan);

$data = $validator->validated();
var_dump($data);

Output yang Dihasilkan:

text
array(2) {
  ["judul"]=>
  string(15) "Belajar Laravel"
  ["penulis"]=>
  string(16) "[email protected]"
}

Satu pola terakhir: route group juga menerima associative array berisi atributnya, misalnya Route::group(['prefix' => 'admin', 'as' => 'admin.'], $callback) — setiap kunci seperti prefix atau as hanya entri biasa dalam associative array yang kemudian dibaca oleh framework untuk membentuk kumpulan route. Daftar lengkap kemampuan array PHP bisa kita pelajari di dokumentasi resmi array , sedangkan daftar aturan validasi Laravel tersedia di dokumentasi validation .

Dengan associative array sebagai format data mentah, kita sudah bisa membaca sebagian besar konfigurasi Laravel. Selanjutnya kita berkenalan dengan struktur yang membuat Laravel terasa hidup: anonymous function dan closure yang mengisi route, middleware, hingga validasi.