Symfony 5.1.8 忽略来自 .env.test / .env.test.local 的覆盖

Symfony 5.1.8 ignoring overrides from .env.test / .env.test.local

我有一个 Symfony 5.1.8 项目,我想在其中使用不同的数据库连接进行测试。为此,我为 DATABASE_URL 设置了与我的 .env.local 不同的值的文件 .env.test.local,就像 .env 文件中的文档指出的那样:

# In all environments, the following files are loaded if they exist,
# the latter taking precedence over the former:
#
#  * .env.local                contains default values for the environment variables needed by the app
#  * .env.local.local          uncommitted file with local overrides
#  * .env.local.$APP_ENV       committed environment-specific defaults
#  * .env.local.$APP_ENV.local uncommitted environment-specific overrides
#
# Real environment variables win over .env.local files.

Symfony 似乎忽略了这些覆盖并始终使用 .env.local.

中提供的值

为了找出到底发生了什么,我将 bin/console 中的最后一行从 $application->run($input); 更改为 dd($_ENV);,以便转储 symfony 在执行期间看到的任何环境变量。

以下是我的不同 .env 文件的内容:

.env

APP_ENV=dev
ENV_VAR=ENV

.env.local

APP_ENV=dev
ENV_VAR=ENV_LOCAL

.env.test

APP_ENV=test
ENV_VAR=ENV_TEST

.env.test.local

APP_ENV=test
ENV_VAR=ENV_TEST_LOCAL

当我运行php bin/console现在输出如下:

array:10 [
  "APP_ENV" => "dev"
  "ENV_VAR" => "ENV_LOCAL"
  ...
]

这是我所期望的。但是当我 运行 php bin/console -e test 正在打印以下内容时:

array:10 [
  "APP_ENV" => "test"
  "ENV_VAR" => "ENV_LOCAL"
  ...
]
根据 -e 参数,

APP_ENV 设置正确,但对于 ENV_VAR,仍然采用 .env.local 中的值。

我是否对 .env 文件及其行为有误解,或者这是某种错误?

以防万一,我目前正在 Windows 10 和 PHP 7.3.24.

这是我这边的配置错误。

当我第一次开始这个项目时,我没有完全掌握多级 .env 文件的概念,并对 bin/console 可执行文件做了一点改动,使事情对我来说“更容易”:

curl -o console.temp https://raw.githubusercontent.com/symfony/recipes/master/symfony/console/5.1/bin/console
diff console console.temp
31c31
< (new Dotenv())->bootEnv(dirname(__DIR__) . '/.env.local');
---
> (new Dotenv())->bootEnv(dirname(__DIR__).'/.env');

这当然会阻止整个 DotEnv 东西正常工作。我只是忘记了我介绍的这个更改,但是感谢@PierrickM 对我的问题的评论,现在一切正常!