如何使Symfony从.env以外的其他文件读取env变量?

时间:2019-03-29 19:54:07

标签: symfony environment-variables

Symfony不会从config /参数读取环境变量,即使它们存在于正在运行的Docker容器环境中。

如果没有专门使用.env文件,Symfony会一直抱怨。

如何让Symfony读取环境本身或名为.env以外的文件?

更多信息:

./ symfony / dependency-injection / EnvVarProcessor.php:96中出现问题时,它试图从config/packages/doctrine.yaml加载文件以用于教义ORM。

1 个答案:

答案 0 :(得分:1)

1 。从Docker环境变量中读取环境变量

您知道,symfony只能读取以 SYMFONY __

为前缀的变量

在DockerFile中:

ENV SYMFONY__MY_ENV_VAR myvalue // here  it's not forced to prefix it by SYMFONY__

例如,在配置虚拟主机的apache文件conf中:

 SetEnv SYMFONY__MY_ENV_VAR ${SYMFONY__MY_ENV_VAR} // ${SYMFONY__MY_ENV_VAR} refer to the previous variable declared in docker file 

在你的parameters.yml

  parameters: 
     my_env_value: '%my.env_var%'

Symfony将用两个下划线替换点,以找到没有关键字 symfony __ 的env变量。

示例:

SYMFONY__MY_ENV_VAR  ==> %my_env_var%

因此在您的应用程序中,您只需要注入容器即可以这种方式获取参数:

$this->container->getParameter('my_env_value');

2。。用另一个文件名覆盖.env文件

这里的重点是修改看起来像下面的bootstrap.php文件:

<?php
use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__).'/vendor/autoload.php';
// Load cached env vars if the .env.local.php file exists
// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2)
if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) {
    $_SERVER += $env;
    $_ENV += $env;
} elseif (!class_exists(Dotenv::class)) {
    throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
} else {
    // load all the .env files
    (new Dotenv())->loadEnv(dirname(__DIR__).'/.env'); // just make the file name that you want instead of .env
}
$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV'];
$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0';