Memuat variabel lingkungan dari .env
ke getenv()
, $_ENV
dan $_SERVER
secara otomatis.
Anda tidak boleh menyimpan kredensial sensitif dalam kode Anda . Menyimpan konfigurasi di lingkungan adalah salah satu prinsip aplikasi dua belas faktor. Apa pun yang mungkin berubah di antara lingkungan penerapan – seperti kredensial database atau kredensial untuk layanan pihak ketiga – harus diekstraksi dari kode ke dalam variabel lingkungan.
Pada dasarnya, file .env
adalah cara mudah untuk memuat variabel konfigurasi khusus yang dibutuhkan aplikasi Anda tanpa harus memodifikasi file .htaccess atau host virtual Apache/nginx. Ini berarti Anda tidak perlu mengedit file apa pun di luar proyek, dan semua variabel lingkungan selalu disetel tidak peduli bagaimana Anda menjalankan proyek Anda - Apache, Nginx, CLI, dan bahkan server web bawaan PHP. Ini JAUH lebih mudah daripada semua cara lain yang Anda ketahui untuk menetapkan variabel lingkungan, dan Anda akan menyukainya!
php_value
ke file .htaccessPHP dotenv adalah versi PHP dari dotenv Ruby asli.
Instalasi sangat mudah melalui Komposer:
$ composer require vlucas/phpdotenv
atau tambahkan secara manual ke file composer.json
Anda.
Kami mengikuti pembuatan versi semantik, yang berarti perubahan besar dapat terjadi di antara rilis-rilis besar. Kami memiliki panduan peningkatan yang tersedia untuk V2 ke V3, V3 ke V4 dan V4 ke V5 tersedia di sini.
File .env
umumnya dijauhkan dari kontrol versi karena dapat berisi kunci API dan kata sandi sensitif. File .env.example
terpisah dibuat dengan semua variabel lingkungan yang diperlukan ditentukan kecuali variabel sensitif, yang disediakan pengguna untuk lingkungan pengembangan mereka sendiri atau dikomunikasikan di tempat lain kepada kolaborator proyek. Kolaborator proyek kemudian secara mandiri menyalin file .env.example
ke .env
lokal dan memastikan semua pengaturan sudah benar untuk lingkungan lokalnya, mengisi kunci rahasia atau memberikan nilainya sendiri bila diperlukan. Dalam penggunaan ini, file .env
harus ditambahkan ke file .gitignore
proyek sehingga tidak akan pernah dikomit oleh kolaborator. Penggunaan ini memastikan bahwa tidak ada kata sandi sensitif atau kunci API yang akan ada dalam riwayat kontrol versi sehingga risiko pelanggaran keamanan lebih kecil, dan nilai produksi tidak perlu dibagikan dengan semua kolaborator proyek.
Tambahkan konfigurasi aplikasi Anda ke file .env
di root proyek Anda. Pastikan file .env
ditambahkan ke .gitignore
Anda sehingga tidak dicentang kodenya
S3_BUCKET= " dotenv "
SECRET_KEY= " souper_seekret_key "
Sekarang buat file bernama .env.example
dan periksa ini ke dalam proyek. Ini harus memiliki variabel ENV yang perlu Anda tetapkan, tetapi nilainya harus kosong atau diisi dengan data tiruan. Idenya adalah untuk memberi tahu orang-orang tentang variabel apa yang diperlukan, tetapi tidak memberi mereka nilai produksi yang sensitif.
S3_BUCKET= " devbucket "
SECRET_KEY= " abc123 "
Anda kemudian dapat memuat .env
di aplikasi Anda dengan:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> load ();
Untuk menyembunyikan pengecualian yang muncul ketika tidak ada file .env
, Anda dapat:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> safeLoad ();
Secara opsional, Anda dapat memasukkan nama file sebagai parameter kedua, jika Anda ingin menggunakan sesuatu selain .env
:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ , ' myconfig ' );
$ dotenv -> load ();
Semua variabel yang ditentukan sekarang tersedia di super-global $_ENV
dan $_SERVER
.
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
Menggunakan getenv()
dan putenv()
sangat tidak disarankan karena fungsi-fungsi ini tidak aman untuk thread, namun masih mungkin untuk menginstruksikan PHP dotenv untuk menggunakan fungsi-fungsi ini. Daripada memanggil Dotenv::createImmutable
, seseorang dapat memanggil Dotenv::createUnsafeImmutable
, yang akan menambahkan PutenvAdapter
di belakang layar. Variabel lingkungan Anda sekarang akan tersedia menggunakan metode getenv
, serta super-global:
$ s3_bucket = getenv ( ' S3_BUCKET ' );
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
Variabel lingkungan dapat disarangkan ke dalam variabel lingkungan lain, berguna untuk mengurangi pengulangan.
Hal ini dilakukan dengan membungkus variabel lingkungan yang ada dalam ${…}
misalnya
BASE_DIR= " /var/webroot/project-root "
CACHE_DIR= " ${BASE_DIR} /cache "
TMP_DIR= " ${BASE_DIR} /tmp "
Kekekalan mengacu pada apakah Dotenv diizinkan untuk menimpa variabel lingkungan yang ada. Jika Anda ingin Dotenv menimpa variabel lingkungan yang ada, gunakan createMutable
alih-alih createImmutable
:
$ dotenv = Dotenv Dotenv :: createMutable ( __DIR__ );
$ dotenv -> load ();
Di balik layar, ini menginstruksikan "repositori" untuk mengizinkan kekekalan atau tidak. Secara default, repositori dikonfigurasi untuk memungkinkan penimpaan nilai yang ada secara default, yang relevan jika seseorang memanggil metode "buat" menggunakan RepositoryBuilder
untuk membuat repositori yang lebih khusus:
$ repository = Dotenv Repository RepositoryBuilder :: createWithNoAdapters ()
-> addAdapter ( Dotenv Repository Adapter EnvConstAdapter ::class)
-> addWriter ( Dotenv Repository Adapter PutenvAdapter ::class)
-> immutable ()
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
Contoh di atas akan menulis nilai yang dimuat ke $_ENV
dan putenv
, tetapi saat menginterpolasi variabel lingkungan, kita hanya akan membaca dari $_ENV
. Selain itu, ini tidak akan pernah menggantikan variabel apa pun yang telah ditetapkan sebelum memuat file.
Melalui contoh lain, seseorang juga dapat menentukan sekumpulan variabel untuk dibolehkan dicantumkan. Artinya, hanya variabel dalam daftar izin yang akan dimuat:
$ repository = Dotenv Repository RepositoryBuilder :: createWithDefaultAdapters ()
-> allowList ([ ' FOO ' , ' BAR ' ])
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
PHP dotenv telah membangun fungsionalitas validasi, termasuk untuk menerapkan keberadaan variabel lingkungan. Hal ini sangat berguna untuk memberi tahu orang-orang tentang variabel eksplisit apa pun yang diperlukan sehingga aplikasi Anda tidak akan berfungsi tanpanya.
Anda dapat menggunakan satu string:
$ dotenv -> required ( ' DATABASE_DSN ' );
Atau array string:
$ dotenv -> required ([ ' DB_HOST ' , ' DB_NAME ' , ' DB_USER ' , ' DB_PASS ' ]);
Jika ada var ENV yang hilang, Dotenv akan menampilkan RuntimeException
seperti ini:
One or more environment variables failed assertions: DATABASE_DSN is missing
Selain hanya mengharuskan variabel disetel, Anda mungkin juga perlu memastikan variabel tersebut tidak kosong:
$ dotenv -> required ( ' DATABASE_DSN ' )-> notEmpty ();
Jika variabel lingkungan kosong, Anda akan mendapatkan Pengecualian:
One or more environment variables failed assertions: DATABASE_DSN is empty
Anda mungkin juga perlu memastikan bahwa variabel tersebut bernilai integer. Anda dapat melakukan hal berikut:
$ dotenv -> required ( ' FOO ' )-> isInteger ();
Jika variabel lingkungan bukan bilangan bulat, Anda akan mendapatkan Pengecualian:
One or more environment variables failed assertions: FOO is not an integer.
Seseorang mungkin hanya ingin menerapkan aturan validasi ketika variabel disetel. Kami juga mendukung hal ini:
$ dotenv -> ifPresent ( ' FOO ' )-> isInteger ();
Anda mungkin perlu memastikan suatu variabel berbentuk boolean, menerima "true", "false", "On", "1", "Yes", "Off", "0" dan "No". Anda dapat melakukan hal berikut:
$ dotenv -> required ( ' FOO ' )-> isBoolean ();
Jika variabel lingkungan bukan boolean, Anda akan mendapatkan Pengecualian:
One or more environment variables failed assertions: FOO is not a boolean.
Demikian pula, seseorang dapat menulis:
$ dotenv -> ifPresent ( ' FOO ' )-> isBoolean ();
Dimungkinkan juga untuk menentukan sekumpulan nilai yang seharusnya menjadi variabel lingkungan Anda. Hal ini sangat berguna dalam situasi di mana hanya segelintir opsi atau driver yang benar-benar didukung oleh kode Anda:
$ dotenv -> required ( ' SESSION_STORE ' )-> allowedValues ([ ' Filesystem ' , ' Memcached ' ]);
Jika variabel lingkungan tidak ada dalam daftar nilai yang diizinkan ini, Anda akan mendapatkan Pengecualian serupa:
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
Dimungkinkan juga untuk menentukan regex yang seharusnya menjadi variabel lingkungan Anda.
$ dotenv -> required ( ' FOO ' )-> allowedRegexValues ( ' ([[:lower:]]{3}) ' );
Anda dapat mengomentari file .env
Anda menggunakan karakter #
. Misalnya
# this is a comment
VAR= " value " # comment
VAR=value # comment
Terkadang Anda hanya ingin mengurai file dan menyelesaikan variabel lingkungan bersarang, dengan memberi kami string, dan array dikembalikan kepada Anda. Meskipun hal ini sudah mungkin dilakukan, ini agak rumit, jadi kami telah menyediakan cara langsung untuk melakukannya:
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar']
Dotenv Dotenv :: parse ( " FOO=Bar n BAZ= " Hello $ {FOO} "" );
Ini persis sama dengan:
Dotenv Dotenv :: createArrayBacked ( __DIR__ )-> load ();
Hanya saja, alih-alih menyediakan direktori untuk mencari file tersebut, Anda sudah langsung memberikan isi filenya.
Saat pengembang baru mengkloning basis kode Anda, mereka akan memiliki langkah tambahan satu kali untuk menyalin file .env.example
secara manual ke .env
dan mengisi nilainya sendiri (atau mendapatkan nilai sensitif apa pun dari rekan kerja proyek).
Dalam pengaturan server tertentu (paling sering ditemukan di shared hosting), PHP mungkin menonaktifkan superglobal seperti $_ENV
atau $_SERVER
. Jika variabel-variabel ini tidak disetel, tinjau variables_order
di file php.ini
. Lihat php.net/manual/en/ini.core.php#ini.variables-order.
Jika Anda menemukan kerentanan keamanan dalam paket ini, silakan kirim email ke [email protected]. Semua kerentanan keamanan akan segera diatasi. Anda dapat melihat kebijakan keamanan lengkap kami di sini.
PHP dotenv dilisensikan di bawah Lisensi 3-Klausul BSD.
Tersedia sebagai bagian dari Langganan Tidelift
Pengelola vlucas/phpdotenv
dan ribuan paket lainnya bekerja sama dengan Tidelift untuk memberikan dukungan komersial dan pemeliharaan untuk dependensi sumber terbuka yang Anda gunakan untuk membangun aplikasi Anda. Menghemat waktu, mengurangi risiko, dan meningkatkan kesehatan kode, sekaligus membayar pengelola dependensi yang Anda gunakan. Pelajari lebih lanjut.