alzen8work / phpdotenv
自动将环境变量从 `.env` 文件加载到 `getenv()`、`$_ENV` 和 `$_SERVER`。
Requires
- php: ^7.1.3 || ^8.0
- ext-pcre: *
- graham-campbell/result-type: ^1.0.1
- phpoption/phpoption: ^1.7.4
- symfony/polyfill-ctype: ^1.17
- symfony/polyfill-mbstring: ^1.17
- symfony/polyfill-php80: ^1.17
Requires (Dev)
- ext-filter: *
- bamarni/composer-bin-plugin: ^1.4.1
- phpunit/phpunit: ^7.5.20 || ^8.5.14 || ^9.5.1
Suggests
- ext-filter: Required to use the boolean validator.
- dev-master / 5.3.x-dev
- v5.3.0
- 5.2.x-dev
- v5.2.0
- 5.1.x-dev
- v5.1.0
- 5.0.x-dev
- v5.0.1
- v5.0.0
- 4.2.x-dev
- v4.2.0
- 4.1.x-dev
- v4.1.8
- v4.1.7
- v4.1.6
- v4.1.5
- v4.1.4
- v4.1.3
- v4.1.2
- v4.1.1
- v4.1.0
- 4.0.x-dev
- v4.0.1
- v4.0.0
- 3.6.x-dev
- v3.6.8
- v3.6.7
- v3.6.6
- v3.6.5
- v3.6.4
- v3.6.3
- v3.6.2
- v3.6.1
- v3.6.0
- 3.5.x-dev
- v3.5.0
- 3.4.x-dev
- v3.4.0
- 3.3.x-dev
- v3.3.3
- v3.3.2
- v3.3.1
- v3.3.0
- 3.2.x-dev
- v3.2.0
- 3.1.x-dev
- v3.1.1
- v3.1.0
- 3.0.x-dev
- v3.0.0
- 2.6.x-dev
- v2.6.7
- v2.6.6
- v2.6.5
- v2.6.4
- v2.6.3
- v2.6.2
- v2.6.1
- v2.6.0
- 2.5.x-dev
- v2.5.2
- v2.5.1
- v2.5.0
- 2.4.x-dev
- v2.4.0
- 2.3.x-dev
- v2.3.0
- 2.2.x-dev
- v2.2.1
- v2.2.0
- 2.1.x-dev
- v2.1.1
- v2.1.0
- 2.0.x-dev
- v2.0.1
- v2.0.0
- 1.1.x-dev
- v1.1.1
- v1.1.0
- v1.0.9
- v1.0.8
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
This package is not auto-updated.
Last update: 2024-09-26 09:55:43 UTC
README
自动将环境变量从 .env
文件加载到 getenv()
、$_ENV
和 $_SERVER
。
为什么是 .env?
永远不要将敏感凭证存储在代码中。 将配置存储在环境变量中是十二要素应用的一条原则。任何可能在部署环境之间变化的内容(如数据库凭证或第三方服务的凭证)都应该从代码中提取出来,存储在环境变量中。
基本上,一个 .env
文件是加载应用所需的自定义配置变量的一种简单方式,无需修改 .htaccess 文件或 Apache/nginx 虚拟主机。这意味着您无需编辑项目外的任何文件,无论您如何运行项目(Apache、Nginx、CLI,甚至是 PHP 内置的 web 服务器),所有环境变量都会设置好。这比您知道的所有其他设置环境变量的方式都要简单得多,您一定会喜欢它!
- 无需在 Apache 或 Nginx 中编辑虚拟主机
- 无需向 .htaccess 文件中添加
php_value
标志 - 易于便携和共享所需的 ENV 值
- 与 PHP 内置的 web 服务器和 CLI 运行器兼容
PHP dotenv 是原始 Ruby dotenv 的 PHP 版本。
安装
通过 Composer 安装非常简单
$ composer require alzen8work/phpdotenv
或者手动将其添加到您的 composer.json
文件中。
升级
我们遵循 语义版本控制,这意味着在主要版本之间可能会发生破坏性变更。我们提供了从 V2 到 V3、V3 到 V4 和 V4 到 V5 的升级指南,可在此处找到:这里。
使用方法
通常,`.env` 文件不会放入版本控制中,因为它可能包含敏感的 API 密钥和密码。创建一个包含所有必需环境变量定义(除了敏感变量)的单独的 `.env.example
` 文件,这些敏感变量由用户提供,用于他们的开发环境,或者通过其他方式传达给项目合作者。然后项目合作者独立地将 `.env.example
` 文件复制到本地 `.env
`,并确保所有设置对于他们的本地环境都是正确的,在必要时填写秘密密钥或提供自己的值。在这种使用方式中,应将 `.env
` 文件添加到项目的 `.gitignore
` 文件中,以确保合作者不会将其提交到代码中。这种使用方式确保敏感密码或 API 密钥永远不会出现在版本控制历史中,从而降低了安全漏洞的风险,并且生产值永远不会与所有项目合作者共享。
将您的应用配置添加到项目根目录下的 .env
文件中。请确保将 .env
文件添加到您的 .gitignore
中,以便它不会被检查到代码中
S3_BUCKET="dotenv" SECRET_KEY="souper_seekret_key"
现在创建一个名为 .env.example
的文件,并将其添加到项目中。这个文件应包含所需的 ENV 变量,但值应留空或填写示例数据。目的是让人们知道需要哪些变量,但不要提供敏感的生产值。
S3_BUCKET="devbucket" SECRET_KEY="abc123"
然后,您可以使用以下方式在应用程序中加载 .env
:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
可选地,您可以将文件名作为第二个参数传递,如果您想使用除 .env
之外的其他文件。
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__, 'myconfig'); $dotenv->load();
现在,所有定义的变量都可在 $_ENV
和 $_SERVER
超全局变量中使用。
$s3_bucket = $_ENV['S3_BUCKET']; $s3_bucket = $_SERVER['S3_BUCKET'];
Putenv 和 Getenv
由于这些函数不是线程安全的,使用 getenv()
和 putenv()
被强烈建议。但是,您仍然可以指示 PHP dotenv 使用这些函数。代替调用 Dotenv::createImmutable
,您可以调用 Dotenv::createUnsafeImmutable
,这将幕后添加 PutenvAdapter
。现在,您可以使用 getenv
方法以及超全局变量来访问环境变量。
$s3_bucket = getenv('S3_BUCKET'); $s3_bucket = $_ENV['S3_BUCKET']; $s3_bucket = $_SERVER['S3_BUCKET'];
嵌套变量
可以在另一个环境变量内嵌套环境变量,这有助于减少重复。
这是通过将现有环境变量包裹在 ${…}
中来完成的,例如:
BASE_DIR="/var/webroot/project-root" CACHE_DIR="${BASE_DIR}/cache" TMP_DIR="${BASE_DIR}/tmp"
不可变性和仓库定制
不可变性指的是 Dotenv 是否允许覆盖现有的环境变量。如果您想允许 Dotenv 覆盖现有的环境变量,请使用 createMutable
而不是 createImmutable
$dotenv = Dotenv\Dotenv::createMutable(__DIR__); $dotenv->load();
幕后,这是在指示“仓库”是否允许不可变性。默认情况下,仓库配置为允许覆盖现有值,这在调用“create”方法时使用 RepositoryBuilder
构造更自定义的仓库时是相关的。
$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();
上面的示例将加载的值写入 $_ENV
和 putenv
,但在插值环境变量时,我们只从 $_ENV
读取。此外,它永远不会替换在加载文件之前已设置的任何变量。
通过另一个示例,也可以指定一组允许的变量。也就是说,只有允许列表中的变量将被加载。
$repository = Dotenv\Repository\RepositoryBuilder::createWithDefaultAdapters() ->allowList(['FOO', 'BAR']) ->make(); $dotenv = Dotenv\Dotenv::create($repository, __DIR__); $dotenv->load();
要求设置变量
PHP dotenv 具有内置的验证功能,包括强制环境变量的存在。这特别有用,可以让人们知道任何明确要求设置的变量,没有这些变量应用程序将无法运行。
您可以使用单个字符串
$dotenv->required('DATABASE_DSN');
或字符串数组
$dotenv->required(['DB_HOST', 'DB_NAME', 'DB_USER', 'DB_PASS']);
如果缺少任何 ENV 变量,Dotenv 将抛出类似于这样的 RuntimeException
One or more environment variables failed assertions: DATABASE_DSN is missing
空变量
除了要求设置变量之外,您可能还需要确保变量不为空。
$dotenv->required('DATABASE_DSN')->notEmpty();
如果环境变量为空,您将得到一个异常。
One or more environment variables failed assertions: DATABASE_DSN is empty
整数变量
您可能还需要确保变量是整数值。您可以进行以下操作:
$dotenv->required('FOO')->isInteger();
如果环境变量不是整数,您将得到一个异常。
One or more environment variables failed assertions: FOO is not an integer.
我们同样支持在变量设置时强制验证规则。
$dotenv->ifPresent('FOO')->isInteger();
布尔变量
您可能需要确保变量是布尔形式,接受“true”、“false”、“On”、“1”、“Yes”、“Off”、“0”和“No”。您可以这样做:
$dotenv->required('FOO')->isBoolean();
如果环境变量不是布尔值,您将得到一个异常。
One or more environment variables failed assertions: FOO is not a boolean.
类似地,您可以写:
$dotenv->ifPresent('FOO')->isBoolean();
允许的值
您还可以定义环境变量应该具有的一组值。这在代码只支持少数选项或驱动程序的情况下特别有用。
$dotenv->required('SESSION_STORE')->allowedValues(['Filesystem', 'Memcached']);
如果环境变量不在允许值的列表中,您将得到类似的异常。
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
您还可以定义一个正则表达式,以确定环境变量的值。
$dotenv->required('FOO')->allowedRegexValues('([[:lower:]]{3})');
注释
您可以使用 #
字符对 .env
文件进行注释。例如:
# this is a comment VAR="value" # comment VAR=value # comment
不加载解析
有时你只想解析文件并解析嵌套的环境变量,通过给我们一个字符串,然后返回一个数组给你。虽然这已经可能,但这有点麻烦,所以我们提供了一个直接的方法来做到这一点
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar'] Dotenv\Dotenv::parse("FOO=Bar\nBAZ=\"Hello \${FOO}\"");
这完全等同于
Dotenv\Dotenv::createArrayBacked(__DIR__)->load();
只是,你直接提供了文件内容,而不是提供查找文件的目录。
使用说明
当新开发者克隆你的代码库时,他们需要额外的一次性步骤手动将 .env.example
文件复制到 .env
并填写自己的值(或从项目同事那里获取任何敏感值)。
安全
如果你在这个包中发现安全漏洞,请发送电子邮件给 Graham Campbell,地址为 graham@alt-three.com。所有安全漏洞都将得到及时解决。您可以在此查看我们的完整安全策略 这里。
许可证
PHP dotenv 在 BSD 3-Clause 许可证下授权。
对企业
作为 Tidelift 订阅的一部分提供
vlucas/phpdotenv
的维护者以及数千个其他包的维护者正在与 Tidelift 合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,并提高代码质量,同时支付你使用的确切依赖项的维护者。了解更多信息 点击这里。