enjoys/dotenv

从 .env 文件中注册环境变量

3.0.8 2023-08-31 07:20 UTC

README

build Scrutinizer Code Quality Code Coverage Mutation testing badge

Парсер .env файлов.

根据 APP_ENV 加载 .env.dist.env 和其他文件。例如,如果 APP_ENV=test,则尝试加载 .env.test

配置文件优先级

  • 首先加载 dist 文件,但它的优先级最低。
  • 然后加载主文件 (.env),其中定义的所有参数将覆盖 dist
  • 最后是环境变量文件,如果它存在。其中定义的所有参数将具有最高优先级,并覆盖前面的值。此文件不是必需的。
  • 通过系统设置的环境变量(例如通过 export 等)具有最高优先级,因为它们不会被覆盖

安装

composer require enjoys/dotenv

使用

use Enjoys\Dotenv\Dotenv;
 
# loaded line __DIR__.'/.env.dist -> __DIR__.'/.env' -> __DIR__.'/.env.<APP_ENV> (repeat.env.<APP_ENV> if redefined) 
$dotenv = new Dotenv(__DIR__.'/.env'); 
// config available in $_ENV
$dotenv->loadEnv(); 

# config available in $_ENV and getenv()
# $dotenv->loadEnv(true); 

.env 文件格式

VAR1 = value # можно использовать пробелы вокруг знака `=`
VAR2=value2
VAR3="this is value #3"
VAR4=value 4 #return `value 4
VAR5=${VAR4}2 # variable, return `value 42`
VAR6="it\'s a beautiful life"
VAR7 # if set Parser::AUTO_CAST_VALUE_TYPE return `null`, else empty string
VAR8= #return empty string
VAR9=${NOT_DEFINED_VAR:-value} # VAR9='value', but NOT_DEFINED_VAR - not set
VAR10=${NOT_DEFINED_VAR:=value} # VAR10='value' and  NOT_DEFINED_VAR='value'
VAR10=${NOT_DEFINED_VAR:?} # throw Exception

附加功能

类型转换

所有 .env 文件中的值都是字符串(string),但有时将值转换为相应类型会更方便。这可以通过使用方法 enableCastType() 并设置属性 $castType 为 true 来实现。

use Enjoys\Dotenv\Dotenv;
$dotenv = new  Dotenv(__DIR__.'/.env');
$dotenv->enableCastType();
$dotenv->loadEnv();

...或通过使用 Dotenv::CAST_TYPE_ENV_VALUE 标志

use \Enjoys\Dotenv\Dotenv;
$dotenv = new Dotenv(__DIR__.'/.env', flags: Dotenv::CAST_TYPE_ENV_VALUE);
$dotenv->loadEnv();

可用标志

以下是一些变量转换的示例

VAR = *true  #bool(true)
VAR = true  #bool(true)
VAR = *false  #bool(false)
VAR = false  #bool(false)
VAR = *bool somethig  #bool(true)
VAR = *bool  #bool(false)
VAR = *int 42  #int(42)
VAR = "*int 42"  #string
VAR = 42  #int(42)
VAR = '42'  #string
VAR = 3.14  #float(3.14)
VAR = 3,14  #float(3.14)
VAR = *float 3,14  #float(3.14)
VAR = *double 3.14  #float(3.14)
VAR = "3.14"  #string
#и т.д.
  • *bool - 返回 bool(true) 或 bool(false)
  • *true - 返回 bool(true)
  • *false - 返回 bool(false)
  • *null - 返回 NULL
  • *int *int 42 返回 int(42)
  • *int8
  • *int16
  • *float 或 *double *float 3,14 返回 float(3.14),逗号自动替换为点
  • *string - *string *int 返回 string(4) "*int"

注意 类型转换仅在当前库使用时有效,在解析文件时使用其他库或系统时,值可能不会被转换为类型。

默认变量值

如果变量未设置,可以定义默认值。有两种方式可以实现这一点

  1. ${VAR:-default} - 在这种情况下,如果变量未设置,将返回冒号后面的值,变量本身也将保持未设置状态,否则将返回变量的值。
  2. ${VAR:=default} - 在这种情况下,如果变量未设置,将返回冒号后面的值,并将变量设置为该值,否则将返回变量的值。

注意! 如果变量未设置且未提供默认值,则将返回空字符串。

要在这种情况下引发错误,可以在变量名称后指定 :?:?message。如果变量未设置,将抛出 \Enjoys\Dotenv\Exception\InvalidArgumentException 异常

例如

VAR1=${NOT_DEFINED_VAR:?extended error message} #with error message
VAR2=${NOT_DEFINED_VAR:?} #or just with empty error message

可用标志

  • CLEAR_MEMORY_AFTER_LOAD_ENV - 在将所有值设置为 $_ENV、$_SERVER 或 putenv() 后清除内存
  • CAST_TYPE_ENV_VALUE - 根据内容(string|bool|int|float|null)进行类型转换
  • POPULATE_PUTENV - 将可用的值除了 $_ENV 之外也通过 getenv() 提供
  • POPULATE_SERVER - 将可用的值除了 $_ENV 之外也通过 $_SERVER 提供

标志可以通过 | 组合,例如 Dotenv::CAST_TYPE_ENV_VALUE|Dotenv::POPULATE_PUTENV