Сконфигурируйте сервисы с env vars во время компиляции - PullRequest
1 голос
/ 17 июня 2019

До сих пор я использовал параметры контейнера из неверсионного файла parameters.yml для настройки некоторых пакетов.Параметры, которые были прочитаны во время компиляции контейнера, чтобы определить, какие сервисы необходимо добавить в определение сервиса.

Сегодня я бы хотел заменить конфигурацию parameters.yml переменными среды, но так как они разрешаются вво время выполнения, их значение недоступно при сборке контейнера, и сервисы должны быть общедоступными впоследствии.

Я что-то здесь упускаю?Существует ли чистый способ настройки служб таким образом?

[править]

Я хочу внедрить пользовательского провайдера в MyServiceв зависимости от того, включена ли функция mock, и укажите имя пользователя.

# 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));
    }
}
...