โ† Semua pembelajaran / Laravel Nol โ†’ Enterprise
Fase 0 ยท Fondasi PHP & Tooling

Konfigurasi & environment

Laravel memisahkan konfigurasi (ikut ke git) dari environment (tidak pernah ikut). Batas antara keduanya tipis, dan melanggarnya menghasilkan bug yang hanya muncul di produksi.

Sumber asli laravel.com Resmi Rangkuman ~6 menit baca

Intisari

  • env() hanya boleh dipanggil di dalam file config/. Di tempat lain ia akan mengembalikan null setelah config di-cache.
  • Di kode aplikasi, selalu config('services.stripe.key').
  • php artisan config:cache menggabungkan seluruh config jadi satu file โ€” wajib di produksi, terlarang saat .env masih berubah.
  • APP_DEBUG=true di produksi membocorkan stack trace beserta isi environment. Ini kebocoran, bukan ketidaknyamanan.
  • Untuk container, .env bukan jawabannya โ€” variabel disuntikkan lewat environment proses (Fase 9).

Aturan nomor satu

Laravel membaca .env lalu menaruh nilainya ke dalam file di config/. Saat kamu menjalankan php artisan config:cache, seluruh isi config/ dibekukan jadi satu file PHP โ€” dan .env tidak dibaca lagi sama sekali.

// config/services.php  โ† SATU-SATUNYA tempat env() boleh dipakai
return [
    'stripe' => [
        'key'    => env('STRIPE_KEY'),
        'secret' => env('STRIPE_SECRET'),
    ],
];

// app/Services/Pembayaran.php  โ† di sini, selalu config()
$key = config('services.stripe.key');

// JANGAN: setelah config:cache, ini null dan pembayaranmu diam-diam gagal
$key = env('STRIPE_KEY');

Bug ini punya bentuk khas: jalan sempurna di laptop, mati di produksi, dan log-nya cuma bilang kredensial kosong. Penyebabnya bukan environment yang salah di-set โ€” melainkan satu env() yang tertinggal di luar config/. Cari dengan grep -rn "env(" app/ routes/; hasil yang benar adalah nol.

Perintah cache dan kapan memakainya

PerintahEfekKapan
config:cacheGabungkan config/ jadi satu fileSaat deploy, setelah env ter-set
config:clearBuang cache, baca .env lagiSaat pengembangan lokal
route:cacheSerialisasi seluruh ruteSaat deploy (gagal kalau ada closure di rute)
view:cacheKompilasi semua Blade di mukaSaat deploy
optimizeKetiganya sekaligus, plus eventIni yang dipakai di Dockerfile
optimize:clearBersihkan semuanyaSaat sesuatu terasa "berhantu"

Gejala yang membingungkan pemula: kamu mengubah .env tapi aplikasi tidak berubah sama sekali. Penyebabnya hampir selalu config yang masih ter-cache. php artisan config:clear, lalu lanjutkan.

Variabel yang menentukan perilaku

VariabelLokalProduksiKalau salah
APP_ENVlocalproductionPerintah destruktif tidak lagi meminta konfirmasi
APP_DEBUGtruefalseStack trace + isi environment tampil ke publik
APP_URLhttp://localhostURL asliTautan di email dan aset mengarah ke tempat yang salah
APP_KEYotomatisdari secret storeSession dan data terenkripsi tidak bisa dibaca
LOG_CHANNELstackstderr di containerLog menumpuk di disk kontainer dan hilang saat restart

Membaca dan menguji konfigurasi

# lihat satu nilai apa adanya, setelah semua lapisan diterapkan
php artisan tinker --execute="dd(config('database.default'))"

# apakah aplikasi ini sudah siap produksi?
php artisan about

php artisan about merangkum versi PHP, driver cache, driver queue, dan status setiap cache konfigurasi. Ini perintah diagnostik pertama saat menghadapi server orang lain.

Kenapa .env tidak cukup untuk produksi

File .env berarti rahasia tersimpan sebagai berkas teks di dalam image atau volume. Untuk aplikasi enterprise, yang dipakai adalah environment variable yang disuntikkan saat runtime dari penyimpanan rahasia terkelola โ€” di Fase 9 hal ini menjadi AWS Secrets Manager, dipetakan ke secrets pada task definition ECS. Kodemu tidak berubah sedikit pun: ia tetap membaca config(), dan config/ tetap membaca env(). Yang berubah hanya dari mana nilainya datang.

Latihan: tambahkan PENGIRIMAN_GRATIS_MULAI=100000 ke .env, bacakan lewat file baru config/toko.php, dan pakai di sebuah rute dengan config('toko.pengiriman_gratis_mulai'). Lalu jalankan php artisan config:cache, ubah nilainya di .env, muat ulang halaman โ€” dan buktikan sendiri bahwa nilainya tidak berubah sampai kamu menjalankan config:clear.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.