Symfony不会从config /参数读取环境变量,即使它们存在于正在运行的Docker容器环境中。
如果没有专门使用.env
文件,Symfony会一直抱怨。
如何让Symfony读取环境本身或名为.env
以外的文件?
更多信息:
./ symfony / dependency-injection / EnvVarProcessor.php:96中出现问题时,它试图从config/packages/doctrine.yaml
加载文件以用于教义ORM。
答案 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';