Aplikasi yang sama hampir selalu butuh pengaturan berbeda antara komputer pengembangan dan server produksi: mode debug aktif di lokal tetapi mati di produksi, kredensial database berbeda, driver cache berbeda. Laravel menyelesaikan masalah ini lewat berkas .env yang memisahkan seluruh nilai lingkungan dari kode. Pada chapter ini kita akan bedah isi .env, memahami peran APP_KEY dan APP_ENV, lalu mempelajari aturan penting dalam membaca environment variable dari dalam kode — termasuk satu jebakan yang sering mengejutkan pemula.

Anatomi Berkas .env #

Berkas .env berada di direktori akar proyek dan memakai format sederhana KEY=VALUE yang diproses pustaka DotEnv . Bagian atas berkas .env aplikasi segar terlihat seperti ini:

dotenv
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:Y29udG9oLWt1bmNpLWlsdXN0cmFzaS1idWthbi1yYWhhc2lh
APP_DEBUG=true
APP_URL=http://localhost:8000

DB_CONNECTION=sqlite
SESSION_DRIVER=database
QUEUE_CONNECTION=database
CACHE_STORE=database

Nilai dengan spasi perlu diapit tanda kutip, baris yang diawali # dianggap komentar, dan true/false otomatis dikonversi menjadi boolean saat dibaca. Berkas ini dibuat otomatis dari .env.example saat instalasi, dan karena berisi kredensial, .gitignore Laravel sudah mengecualikannya dari repositori Git — kita cukup menyimpan .env.example sebagai dokumentasi kunci yang dibutuhkan proyek.

APP_KEY #

APP_KEY adalah kunci acak sepanjang 32 byte yang dienkode base64 dan dipakai Laravel untuk symmetric encryption — mengenkripsi data seperti session terenkripsi dan encrypted casts pada kolom Eloquent. Kunci ini dihasilkan otomatis saat instalasi, tetapi kita juga bisa membuatnya sendiri:

bash
php artisan key:generate --show

Output yang Dihasilkan:

text
base64:yRSp+4H/Nk5EUwyvG3VOdowAM1x+WSDzjFtDrHSrnWg=

Tanpa opsi --show, perintah key:generate langsung menulis kunci baru ke .env. Data yang dienkripsi dengan kunci lama tidak bisa didekripsi setelah kunci berganti, jadi penggantian kunci di aplikasi yang sudah berjalan harus dilakukan dengan kesadaran penuh.

APP_ENV dan APP_DEBUG #

Dua variabel berikutnya mengendalikan “kepribadian” aplikasi kita. APP_ENV menandai lingkungan berjalan — nilainya local saat pengembangan dan production di server sungguhan. Kita bisa memastikan lingkungan aktif dari artisan:

bash
php artisan env

Output yang Dihasilkan:

text
   INFO  The application environment is [local].

Sementara APP_DEBUG=true membuat Laravel menampilkan halaman galat lengkap berisi stack trace — sangat membantu saat pengembangan, tetapi membocorkan detail server, kredensial dari stack trace, dan struktur aplikasi bila menyala di produksi. Karena itu APP_DEBUG wajib false di lingkungan produksi. Ringkasan seluruh status konfigurasi bisa dilihat lewat php artisan about, yang menampilkan versi PHP, environment, mode debug, hingga driver database pada satu layar.

env() vs config() #

Nilai .env pada akhirnya dibaca berkas-berkas di config/ melalui function env(), lalu kode aplikasi membacanya lewat config(). Sebagai contoh, config/app.php memuat baris 'name' => env('APP_NAME', 'Laravel'), sehingga nama aplikasi bisa kita baca dengan config('app.name').

Aturannya tegas: env() hanya boleh dipanggil di dalam berkas config/, dan kode aplikasi selalu memakai config(). Alasannya berkaitan dengan configuration caching. Saat produksi, kita bisa menggabungkan seluruh berkas konfigurasi menjadi satu berkas cache dengan config:cache; setelah itu Laravel berhenti memuat .env, dan env() hanya mengembalikan environment variable level sistem — bukan isi .env. Kita buktikan perilaku ini pada aplikasi uji: setelah menjalankan php artisan config:cache, eksekusi perintah berikut:

bash
php artisan tinker --execute="var_dump(config('app.name'), env('APP_NAME'));"

Output yang Dihasilkan:

text
string(7) "Laravel"
NULL

Nilai config('app.name') tetap terbaca karena cache sudah menyimpan hasilnya, tetapi env('APP_NAME') mengembalikan NULL karena .env tidak lagi dimuat. Setelah eksperimen, kembalikan kondisi semula dengan php artisan config:clear — perintah config:cache memang tidak untuk dipakai saat pengembangan lokal karena konfigurasi sering berubah.

Membaca dan Mengubah Konfigurasi #

Function config() menerima sintaks “titik” — nama berkas diikuti opsi — dan menerima nilai bawaan sebagai argumen kedua:

php
$name = config('app.name');            // "Laravel"
$tz = config('app.timezone', 'UTC');   // nilai bawaan bila opsi tidak ada

Nilai konfigurasi juga bisa diubah pada runtime dengan config(['app.timezone' => 'Asia/Jakarta']). Kombinasi .env + berkas config/ inilah yang membuat satu basis kode bisa berperilaku berbeda di tiap lingkungan tanpa menyentuh kode aplikasi.

Konfigurasi kini lengkap: database siap, environment dipahami. Saatnya menjalankan aplikasi pertama kita di browser melalui development server — topik chapter berikutnya.