Načítá proměnné prostředí z .env
do getenv()
, $_ENV
a $_SERVER
automaticky.
Proč .env?
V kódu byste nikdy neměli ukládat citlivé údaje. Ukládáníkonfigurace do prostředí je jedním z principů dvanáctifaktorové aplikace. Vše, co se pravděpodobně změní mezi jednotlivými prostředími nasazení – například pověření pro databázi nebo pověření pro služby třetích stran – by mělo být z kódu extrahováno do proměnných prostředí.
Soubor .env
je v podstatě snadný způsob, jak načíst vlastní konfigurační proměnné, které vaše aplikace potřebuje, aniž byste museli upravovat soubory .htaccess nebo virtuální hostitele Apache/nginx. To znamená, že nebudete muset upravovat žádné soubory mimo projekt a všechny proměnné prostředí budou vždy nastaveny bez ohledu na to, jak váš projekt používá – Apache, Nginx, CLI a dokonce i vestavěný webový server PHP. Je to DOST jednodušší než všechny ostatní způsoby nastavení proměnných prostředí,které znáte,a zamilujete si to!
- Žádné úpravy virtuálních hostitelů v Apache nebo Nginx
- Žádné přidávání
php_value
příznaků do .htaccess souborů - JEDNODUCHÁ přenositelnost a sdílení požadovaných hodnot ENV
- KOMPATIBILNÍ s vestavěným webovým serverem PHP a spouštěčem CLI
PHP dotenv je PHP verze původního Rubydotenv.
Instalace
Instalace je velmi snadná pomocí nástroje Composer:
$ composer require vlucas/phpdotenv
nebo jej přidejte ručně do svého composer.json
souboru.
Upgrade
Postupujeme podle sémantického verzování, což znamená, že mezi hlavními verzemi může dojít k rozbití změn. Máme k dispozici průvodce upgradem z V2 na V3, z V3 na V4 a z V4 na V5, které jsou k dispozici zde.
Použití
Soubor .env
je obecně držen mimo kontrolu verzí, protože může obsahovat citlivé klíče a hesla API. Je vytvořen samostatný soubor .env.example
s definovanými všemi požadovanými proměnnými prostředí s výjimkou citlivých, které si uživatelé buď dodávají pro svá vlastní vývojová prostředí, nebo je sdělují spolupracovníkům projektu jinde. Spolupracovníci projektu pak nezávisle zkopírují soubor .env.example
do místního souboru .env
a zajistí, aby všechna nastavení byla správná pro jejich místní prostředí, a v případě potřeby vyplní tajné klíče nebo poskytnou vlastní hodnoty. Při tomto použití by měl být soubor .env
přidán do souboru .gitignore
projektu, aby jej spolupracovníci nikdy neodevzdali. Toto použití zajišťuje, že se v historii správy verzí nikdy neobjeví žádná citlivá hesla nebo klíče API, takže je menší riziko narušení bezpečnosti a výrobní hodnoty nikdy nebudou muset být sdíleny se všemi spolupracovníky projektu.
Přidejte konfiguraci aplikace do souboru .env
v kořenovém adresáři projektu. Ujistěte se, že soubor .env
je přidán do vašeho .gitignore
, aby nebyl zkontrolován v kódu
S3_BUCKET="dotenv"SECRET_KEY="souper_seekret_key"
Nyní vytvořte soubor s názvem .env.example
a zkontrolujte jej v projektu. Ten by měl obsahovat proměnné ENV, které potřebujete mít nastavené, ale hodnoty by mělybýt buď prázdné, nebo vyplněné fiktivními daty. Smyslem je dát lidem vědět, jaképroměnné jsou požadovány, ale nedávat jim citlivé výrobní hodnoty.
S3_BUCKET="devbucket"SECRET_KEY="abc123"
V aplikaci pak můžete .env
načíst pomocí:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);$dotenv->load();
Pro potlačení výjimky, která je vyhozena, když neexistuje soubor .env
, můžete:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);$dotenv->safeLoad();
Případně můžete jako druhý parametr předat název souboru, pokud byste chtěli použít něco jiného než .env
:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__, 'myconfig');$dotenv->load();
Všechny definované proměnné jsou nyní dostupné v $_ENV
a $_SERVER
superglobálech.
$s3_bucket = $_ENV;$s3_bucket = $_SERVER;
Putenv a Getenv
Používání getenv()
a putenv()
se důrazně nedoporučuje vzhledem k tomu, že tyto funkce nejsou bezpečné pro vlákna, nicméně je stále možné instruovatPHP dotenv, aby tyto funkce používal. Namísto volání Dotenv::createImmutable
lze volat Dotenv::createUnsafeImmutable
, která v zákulisí přidá PutenvAdapter
. Vaše proměnné prostředí budou nyní dostupné pomocí metody getenv
, stejně jako superglobály:
$s3_bucket = getenv('S3_BUCKET');$s3_bucket = $_ENV;$s3_bucket = $_SERVER;
Vnořování proměnných
Proměnnou prostředí je možné vnořit do jiné, což je užitečné pro omezení opakování.
To se provádí zabalením existující proměnné prostředí do ${…}
např.
BASE_DIR="/var/webroot/project-root"CACHE_DIR="${BASE_DIR}/cache"TMP_DIR="${BASE_DIR}/tmp"
Nezměnitelnost a přizpůsobení úložiště
Nezměnitelnost se týká toho, zda je Dotenv povoleno přepisovat existující proměnné prostředí. Pokud chcete, aby Dotenv přepsal existující proměnné prostředí,použijte místo createImmutable
createMutable
:
$dotenv = Dotenv\Dotenv::createMutable(__DIR__);$dotenv->load();
V pozadí se jedná o pokyn „úložišti“, zda má povolit imutabilitu, nebo ne. Ve výchozím nastavení je úložiště nakonfigurováno tak, aby ve výchozím nastavení umožňovalo přepisování existujícíchhodnot, což má význam, pokud voláme metodu „create“ pomocí RepositoryBuilder
pro konstrukci více vlastního úložiště:
$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();
Výše uvedený příklad zapíše načtené hodnoty do $_ENV
a putenv
, ale přiinterpolaci proměnných prostředí budeme číst pouze z $_ENV
. Navíc nikdy nenahradí žádné proměnné, které již byly nastaveny před načtením souboru.
Pomocí jiného příkladu lze také zadat sadu proměnných, které se mají nechat vypsat. To znamená, že budou načteny pouze proměnné v povoleném seznamu:
$repository = Dotenv\Repository\RepositoryBuilder::createWithDefaultAdapters() ->allowList() ->make();$dotenv = Dotenv\Dotenv::create($repository, __DIR__);$dotenv->load();
Vyžadování nastavení proměnných
PHP dotenv má zabudovanou funkci ověřování, včetně vynucení přítomnosti proměnné prostředí. To je užitečné zejména pro informování o výslovně požadovaných proměnných, bez kterých vaše aplikace nebude fungovat.
Můžete použít jediný řetězec:
$dotenv->required('DATABASE_DSN');
Nebo pole řetězců:
$dotenv->required();
Pokud některá z proměnných ENV chybí, Dotenv vyhodí RuntimeException
jako je tento:
One or more environment variables failed assertions: DATABASE_DSN is missing
Prázdné proměnné
Kromě prostého požadavku na nastavení proměnné můžete také potřebovat zajistit, aby proměnná nebyla prázdná:
$dotenv->required('DATABASE_DSN')->notEmpty();
Pokud je proměnná prostředí prázdná, dostanete výjimku:
One or more environment variables failed assertions: DATABASE_DSN is empty
Celočíselné proměnné
Musíte také zajistit, aby proměnná měla celočíselnou hodnotu. Můžete udělat následující:
$dotenv->required('FOO')->isInteger();
Pokud by proměnná prostředí nebyla celočíselná, dostali byste Výjimku:
One or more environment variables failed assertions: FOO is not an integer.
Někdo může chtít vynutit validační pravidla pouze tehdy, když je proměnná nastavena. Wesupodporuje i toto:
$dotenv->ifPresent('FOO')->isInteger();
Logické proměnné
Možná budete potřebovat zajistit, aby proměnná byla ve tvaru logické proměnné, akceptování „true“, „false“, „On“, „1“, „Yes“, „Off“, „0“ a „No“. Můžete provést následující:
$dotenv->required('FOO')->isBoolean();
Pokud proměnná prostředí není boolean, dostanete výjimku:
One or more environment variables failed assertions: FOO is not a boolean.
Podobně lze napsat:
$dotenv->ifPresent('FOO')->isBoolean();
Povolené hodnoty
Je také možné definovat sadu hodnot, které by vaše proměnné prostředí měly mít. To je užitečné zejména v situacích, kdy je vaším kódem skutečně podporována jen hrstka možností nebo ovladačů:
$dotenv->required('SESSION_STORE')->allowedValues();
Pokud by proměnná prostředí nebyla v tomto seznamu povolených hodnot, dostali byste podobnou výjimku:
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
Je také možné definovat regex, kterým by měla být vaše proměnná prostředí.
$dotenv->required('FOO')->allowedRegexValues('(]{3})');
Soubor .env
můžete okomentovat pomocí znaku #
. Například
# this is a commentVAR="value" # commentVAR=value # comment
Parsování bez načítání
Někdy chcete pouze analyzovat soubor a vyřešit vnořené proměnné prostředí tak, že nám zadáte řetězec a zpět vám bude vráceno pole. I když je to již možné, je to trochu krkolomné, proto jsme poskytli přímý způsob, jak to provést:
// Dotenv\Dotenv::parse("FOO=Bar\nBAZ=\"Hello ${FOO}\"");
Je to úplně stejné jako:
Dotenv\Dotenv::createArrayBacked(__DIR__)->load();
jen místo zadání adresáře pro vyhledání souboru jste zadali přímo obsah souboru.
Poznámky k použití
Když nový vývojář naklonuje vaši kódovou základnu, bude muset provést další jednorázový krok, aby ručně zkopíroval soubor .env.example
do .env
a vyplnil vlastní hodnoty (nebo získal všechny citlivé hodnoty od spolupracovníka projektu).
Bezpečnost
Pokud v tomto balíčku objevíte bezpečnostní chybu, pošlete prosím e-mail Grahamu Campbellovi na adresu [email protected]. Všechny bezpečnostní chyby budou neprodleně vyřešeny. Úplné znění našich bezpečnostních zásad si můžete prohlédnout zde.
Licence
PHP dotenv je licencován pod licencí The BSD 3-Clause License.
Pro podniky
K dispozici v rámci předplatného Tidelift
.