2

在这个小小的 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_LOG但是,我的目标是分别从环境变量中读取日志文件的路径和日志级别LOG_LEVEL。根据外部参数的交响乐文档,在 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...') #4 { main} 在第 107 行抛出 /var/www/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php

我究竟做错了什么?

4

2 回答 2

2

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

composer.json使用以下值编辑您并运行composer update. 您可能需要更新其他依赖项。你可以^3.3dev-master.

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

symfony/__WHATEVER__如果您有其他 symfony 组件,您可能必须这样做。

现在,在将 yaml 配置加载到依赖项容器中后,您就是代码,您可以编译它。

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

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

做这个:

$容器->编译(真);

您的 IDE 的智能感知可能会告诉您 compile 不需要参数。没关系。那是因为compile()通过func_get_arg()间接获取它的参数。

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

参考

于 2017-05-18T14:53:05.753 回答
0

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

$containerBuilder->compile(true); 鉴于您的文件也通过检查此方法也执行的正确配置得到验证。该参数$resolveEnvPlaceholders使 yaml 服务配置可以访问环境变量。

于 2020-06-06T01:41:06.467 回答