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.
Intisari
env()hanya boleh dipanggil di dalam fileconfig/. Di tempat lain ia akan mengembalikannullsetelah config di-cache.- Di kode aplikasi, selalu
config('services.stripe.key'). php artisan config:cachemenggabungkan seluruh config jadi satu file โ wajib di produksi, terlarang saat.envmasih berubah.APP_DEBUG=truedi produksi membocorkan stack trace beserta isi environment. Ini kebocoran, bukan ketidaknyamanan.- Untuk container,
.envbukan 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
| Perintah | Efek | Kapan |
|---|---|---|
config:cache | Gabungkan config/ jadi satu file | Saat deploy, setelah env ter-set |
config:clear | Buang cache, baca .env lagi | Saat pengembangan lokal |
route:cache | Serialisasi seluruh rute | Saat deploy (gagal kalau ada closure di rute) |
view:cache | Kompilasi semua Blade di muka | Saat deploy |
optimize | Ketiganya sekaligus, plus event | Ini yang dipakai di Dockerfile |
optimize:clear | Bersihkan semuanya | Saat 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
| Variabel | Lokal | Produksi | Kalau salah |
|---|---|---|---|
APP_ENV | local | production | Perintah destruktif tidak lagi meminta konfirmasi |
APP_DEBUG | true | false | Stack trace + isi environment tampil ke publik |
APP_URL | http://localhost | URL asli | Tautan di email dan aset mengarah ke tempat yang salah |
APP_KEY | otomatis | dari secret store | Session dan data terenkripsi tidak bisa dibaca |
LOG_CHANNEL | stack | stderr di container | Log 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.