在编译时使用env vars配置服务

时间:2019-06-17 11:52:03

标签: symfony dependency-injection dotenv

直到现在,我一直在使用未经版本控制的parameters.yml文件中的容器参数来配置某些捆绑软件。在容器编译期间读取参数,以确定需要在服务定义中注入哪些服务。

今天,我想用环境变量替换parameters.yml配置,但是由于它们是在运行时解析的,因此在构建容器时它们的值不可用,并且服务必须在以后公开。 / p>

我在这里错过了什么吗?有没有一种干净的方法来配置服务?

[编辑]

我想根据是否启用了MyService功能向mock中注入 user provider 服务,并提供用户名。

# bundle configuration
my_extension:
    mock:
        enabled:  '%env(MOCK_ENABLED)%'
        provider: '%env(MOCK_PROVIDER)%'
        username: '%env(MOCK_USERNAME)%'
<?php

class MyExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        // here, mock_enabled is an env var placeholder, not a boolean value
        // the condition will thus always resolve to true.
        if ($config['mock_enabled']) {

            // The other two env vars will be evaluated at runtime
            // and I'm ok with that
            $username = $config['mock_username'];
            $provider = new Definition(
                $config['mock_provider'],
                [$config['mock_username']]
            );
        } else {
            $provider = new Reference(InMemoryUserProvider::class, [[]];
        }

        $definition = new Definition(MyService::class);
        $definition->addMethodCall('setProvider', new Reference($provider));
    }
}

0 个答案:

没有答案