【问题标题】:Symfony 5.1.8 ignoring overrides from .env.test / .env.test.localSymfony 5.1.8 忽略来自 .env.test / .env.test.local 的覆盖
【发布时间】:2021-03-07 08:27:51
【问题描述】:

我有一个 Symfony 5.1.8 项目,我想在其中使用不同的数据库连接进行测试。为此,我为文件.env.test.local 设置了与.env.local 不同的DATABASE_URL 值,就像.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 的值。

我对@9​​87654348@-文件及其行为有误解还是这是某种错误?

以防万一,我目前正在使用 PHP 7.3.24 在 Windows 10 上工作。

【问题讨论】:

  • 是否有可能在您的环境中定义?如最后一行所述,它们具有更高的优先级。
  • 不,事实并非如此,我仔细检查了。这就是为什么我“发明”了新的ENV_VAR,它在 Symfony 代码的其他任何地方都没有使用。
  • 对我来说,它按预期工作,string(3) "dev" string(9) "ENV_LOCAL" Symfony 4.4.15 (env: dev, debug: true) bash-4.2$ bin/console -V -e test string(4) "test" string(14) "ENV_TEST_LOCAL" Symfony 4.4.15 (env: test, debug: true) 如果你在 shell 中输入env 命令,你是否已经定义了任何ENV_VAR
  • ENV_VAR 尚未定义。我开始认为 Windows 10 + PHP + Symfony 的行为可能很奇怪。由于您的输出中有 bash-4.2,我假设您使用的是某种 linux/unix?我要在我的另一台 linux 机器上检查一下。
  • 您确定您的bin/console 是最新的吗? github.com/symfony/recipes/blob/master/symfony/console/5.1/bin/…

标签: php symfony php-7 dotenv phpdotenv


【解决方案1】:

这是我这边的配置错误。

当我第一次开始这个项目时,我并没有完全掌握多级 .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 对我的问题的评论,现在一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2020-03-30
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多