symfony / yaml支持symfony / config无法解析环境变量

时间:2017-03-27 15:36:05

标签: environment-variables yaml symfony-3.2

我重新创建了一个简单的示例in this tiny github repo。我正在尝试使用symfony/dependency-injection配置monolog/monolog以将日志写入php://stderr。我正在使用名为services.yml的yaml文件来配置依赖注入。

如果我的yml文件如下所示,这一切都正常:

parameters:
    log.file: 'php://stderr'
    log.level: 'DEBUG'

services:
    stream_handler:
    class:     \Monolog\Handler\StreamHandler
    arguments:
     - '%log.file%'
     - '%log.level%'
    log:
    class:     \Monolog\Logger
    arguments: [ 'default',  ['@stream_handler']  ]

但是,我的目标是分别从环境变量$APP_LOGLOG_LEVEL中读取日志文件的路径和日志级别。根据{{​​3}},在services.yml文件中执行此操作的正确方法如下:

parameters:
    log.file: '%env(APP_LOG)%'
    log.level: '%env(LOGGING_LEVEL)%'

在我的示例应用程序中,我验证了PHP可以使用以下内容读取这些环境变量:

echo "Hello World!\n\n";

echo 'APP_LOG=' . (getenv('APP_LOG') ?? '__NULL__') . "\n";
echo 'LOG_LEVEL=' . (getenv('LOG_LEVEL') ?? '__NULL__') . "\n";

当我使用带有硬编码值的原始services.yml时,会将以下内容写入浏览器:

Hello World!

APP_LOG=php://stderr
LOG_LEVEL=debug

但是,如果我在services.yml中使用%env(VAR_NAME)%语法,则会出现以下错误:

  

致命错误:未捕获UnexpectedValueException:无法打开流或文件“env_PATH_a61e1e48db268605210ee2286597d6fb”:无法打开流:/var/www/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php中的权限被拒绝: 107堆栈跟踪:#0 /var/www/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37):Monolog \ Handler \ StreamHandler-> write(Array)#1 / var / www / vendor /monolog/monolog/src/Monolog/Logger.php(337):Monolog \ Handler \ AbstractProcessingHandler-> handle(Array)#2 /var/www/vendor/monolog/monolog/src/Monolog/Logger.php(532) ):Monolog \ Logger-> addRecord(100,'Initialized dep ...',Array)#3 /var/www/html/index.php(17):Monolog \ Logger-> debug('Initialized dep。 ..')#7 {main}在第107行的/var/www/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php中抛出

我做错了什么?

2 个答案:

答案 0 :(得分:2)

好的,你需要一些东西。首先,您需要Symfony的3.3版本,它仍处于测试阶段。当我遇到这个时,3.2是发布的版本。其次你需要"编译"环境变量。

使用以下值修改composer.json并运行composer update。您可能需要更新其他依赖项。您可以将^3.3替换为dev-master

    "symfony/config": "^3.3",
    "symfony/console": "^3.3",
    "symfony/dependency-injection": "^3.3",
    "symfony/yaml": "^3.3",

如果您有其他symfony组件,则可能必须为symfony/__WHATEVER__执行此操作。

现在,在您将yaml配置加载到依赖项容器中之后,您需要编译它。

所以在你排队之后(可能在bin / console中):

$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . DIRECTORY_SEPARATOR . '..'));
$loader->load('services.yml');

这样做:

  

$容器 - >编译(真);

您的IDE的智能感知可能会告诉您编译不带参数。没关系。这是因为compile() grabs its args indirectly来自func_get_arg()

public function compile(/*$resolveEnvPlaceholders = false*/)
{
    if (1 <= func_num_args()) {
        $resolveEnvPlaceholders = func_get_arg(0);
    } else {
    . . .
}

参考

答案 1 :(得分:0)

在加载services.yaml文件后使用此命令应该会有所帮助。

$containerBuilder->compile(true); 给定您的文件,也可以通过检查此方法是否正确配置来验证。参数为$resolveEnvPlaceholders,这使得yaml服务配置可以访问环境变量。