Belajar Symfony - Config Management & Environments
Episode 16 of 27

Belajar Symfony - Config Management & Environments

Mengelola konfigurasi untuk dev, test, dan production: hirarki file .env & Dotenv, env vars, konfigurasi per-environment di config/packages, aturan 12-factor, serta Symfony Secrets Vault untuk menyimpan rahasia produksi dengan aman.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Aplikasi yang berjalan di laptop, server staging, dan production tidak boleh punya konfigurasi yang sama. Episode 16 mengajarkan cara Symfony mengelola perbedaan itu: mana yang ada di kode, mana yang di environment, dan mana yang harus dirahasiakan.

Mengapa ini krusial menjelang production? Karena kesalahan konfigurasi adalah penyebab paling umum kegagalan production yang tidak terdeteksi di dev: APP_ENV=prod tiba-tiba error, database staging ikut terbaca, atau secret bocor ke repository. Memahami model konfigurasi Symfony sejak dini menyelamatkan kalian dari seluruh drama itu.

Hirarki .env dan Dotenv

Symfony memuat environment variables dari file .env dengan urutan prioritas:

Urutan prioritas file env
.env            # baseline, di-commit
.env.local      # overrides lokal, JANGAN di-commit
.env.prod       # overrides per environment, bisa di-commit
.env.prod.local # overrides prod lokal, JANGAN di-commit
.env.test       # khusus testing

Aturan inti:

FileDi-commit?Fungsi
.envYaDefault yang berlaku semua environment
.env.localTidakSetting mesin lokal (API key pribadi)
.env.{env}YaOverride spesifik environment
.env.{env}.localTidakSecret per-server

composer.json punya entry .gitignore standar yang meng-exclude .env.local — jangan pernah menghapusnya. File .env sendiri memuat nilai placeholder (bukan secret) untuk dokumentasi:

.env — pola 12-factor
APP_ENV=dev
APP_SECRET=
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
MAILER_DSN=null://localhost
MESSENGER_TRANSPORT_DSN=doctrine://default

APP_SECRET kosong di .env, diisi di .env.local — cara aman memaksa developer memberi nilai tanpa secret bocor ke git.

Membaca Env Var di Kode dan Config

Ada dua cara membaca nilai di dalam aplikasi:

Baca env var di kode
// 1. Lewat parameter config (direkomendasikan)
$adminEmail = $this->getParameter('app.admin_email');
 
// 2. Langsung dari environment
$token = $_ENV['PAYMENT_TOKEN'] ?? null;
Env var di services.yaml
parameters:
    app.admin_email: '%env(ADMIN_EMAIL)%'
 
services:
    App\Service\Notifier:
        arguments:
            $adminEmail: '%app.admin_email%'

Mengapa lewat parameter? Karena nilai bisa di-resolve sekali saat container dibangun, mudah di-test (override), dan kalian tidak menggantung pada $_ENV yang bergantung konteks eksekusi. %env(VAR)% bisa dipakai langsung di hampir semua file config/packages/*.yaml.

Konfigurasi Per-Environment

File di config/packages/ dibaca untuk semua environment. Untuk perbedaan antar environment, Symfony memakai suffix:

Struktur config per env
config/packages/
├── framework.yaml            # berlaku semua environment
├── framework_dev.yaml        # hanya dev (profiler, dll)
├── framework_prod.yaml       # hanya prod (cache, dll)
└── framework_test.yaml       # hanya test

Contoh nyata — di dev kita ingin log detail dan profiler; di prod tidak:

config/packages/framework_prod.yaml
framework:
    profiler: { collect: false }
    http_cache: true

Environment juga menentukan perilaku perintah: php bin/console cache:clear --env=prod membersihkan cache prod. Sering terjadi kebingungan karena command default memakai dev.

Environment di 12-Factor

Prinsip 12-factor app yang relevan:

  1. Config disimpan di environment — bukan dihardcode dalam kode.
  2. Dev/prod parity — environment yang mirip mengurangi "works on my machine".
  3. Semua environment punya APP_ENV dan APP_SECRET berbeda — mulai dari local.

APP_ENV menentukan segalanya: dev (profiler, log detail, cache dinamis), prod (opcache, log info, cache warmup), test (isolasi database). APP_DEBUG terpisah — kalian bisa punya APP_ENV=prod, APP_DEBUG=false secara eksplisit.

Symfony Secrets Vault

Env var di .env.prod.local tetap ada di server sebagai plaintext. Untuk rahasia yang lebih serius (API key, credentials), Symfony menyediakan Secrets Vault — terenkripsi, disimpan sebagai file:

Kelola secrets
php bin/console secrets:generate-keys    # buat pasangan kunci
php bin/console secrets:set PAYMENT_TOKEN
php bin/console secrets:list             # daftar secret
php bin/console secrets:decrypt-to-local # untuk debugging lokal

Vault terenkripsi dengan kunci publik (di-commit) dan kunci privat (di server production, tidak di-commit). Saat deploy, secret otomatis ter-dekripsi saat container di-build — nilai tidak pernah terlihat sebagai plaintext di repo.

Warning

Aturan prioritas secret: Secrets Vault menang atas .env. Ini bisa mengejutkan — secret yang tersimpan di vault akan menimpa nilai .env. Jika nilai tidak berubah saat kalian ubah .env, cek vault dulu.

Common Pitfalls

  • Secret di-commit — selalu cek git status sebelum push; .env.local dan kunci privat vault wajib masuk .gitignore.
  • APP_ENV salah di production — jika lupa set, Symfony default dev dan profiler aktif — lambat dan bocor informasi.
  • Cache membekukan config lama — setelah mengubah .env/config, jalankan cache:clear (di prod: cache:clear --env=prod).

Penutup

Pada episode 16 ini, kalian telah menguasai manajemen konfigurasi.

Inti yang harus dibawa pulang:

  • Hirarki .env: baseline di-commit, .local untuk mesin/server, suffix untuk environment.
  • Baca env var lewat %env(VAR)% di config dan getParameter() di kode.
  • File config/packages/*_{env}.yaml untuk perbedaan antar environment.
  • Ikuti 12-factor: config di environment, bukan di kode.
  • Secrets Vault menyimpan rahasia terenkripsi; kunci privat tidak pernah di-commit.

Di episode 17 selanjutnya kita menulis pengaman kualitas: Testing (PHPUnit) — unit & integration test, WebTestCase untuk memeriksa response, fixtures untuk data test, serta Panther untuk browser testing. Sampai jumpa di episode 17!

Belajar Symfony - Config Management & Environments | Belajar Symfony