Настройте пакет сторонних производителей Symfony с параметрами контейнера, объявленными в пользовательском расширении контейнера / проходе компилятора

#php #symfony #dependency-injection #symfony5 #doctrine-dbal

Вопрос:

Я хочу настроить пакет доктрины для подключения к DBAL. По какой-то причине для извлечения конфигурации требуется немного логики. Я попытался использовать расширение контейнера, а затем проход компилятора для выполнения логики во время компиляции контейнера и сохранения конфигурации в качестве параметров контейнера.

Во время моих попыток я зарегистрировал расширение и такой пропуск компилятора в классе ядра:

 protected function build(ContainerBuilder $container)
{
    // Those lines weren't there at the same time
    $container->registerExtension(new MyCustomExtension());
    $container->addCompilerPass(new MyCustomCompilerPass());
}
 

Казалось, это работало хорошо, так как я мог видеть свои параметры в консоли:

  # ./bin/console debug:container --parameters

Symfony Container Parameters
============================

 ------------------------------------------------------------- ------------------------------------------------------------------------ 
  Parameter                                                     Value                                                                   
 ------------------------------------------------------------- ------------------------------------------------------------------------ 
 ...
 some.prefix.host                                              some-mariadb-host
 some.prefix.dbname                                            some-database-name
 ...
 

Проблема в том, что когда я пытаюсь использовать эти параметры в своей config/packages/doctrine.yaml , я получаю ошибку при следующей консольной команде:

 doctrine:
    dbal:
        driver: pdo_mysql
        host: '%some.prefix.host%'
        dbname: '%some.prefix.dbname%'
        # ...
 
 # ./bin/console debug:container --parameters

In ParameterBag.php line 98:
                                                                                
  You have requested a non-existent parameter "some.prefix.host".  
                                                                                
 

Я использую Symfony 5.3 и пакет доктрины 2.4.

  • Почему мои параметры кажутся недоступными для конфигурации пакета сторонних производителей ?
  • Как я могу заставить это работать ?
  • Есть ли лучший способ достичь этого ?

Ответ №1:

Я думаю, что конфигурация пакета доктрины обрабатывается до того, как мой проход компилятора сможет объявить параметры. Вероятно, это не может быть решено с помощью компонента DependencyInjection.

Решил эту проблему, импортировав файл конфигурации PHP в services.yaml:

 imports:
    - { resource: my_custom_file.php }
 

Со следующим содержанием:

 use SymfonyComponentDependencyInjectionLoaderConfiguratorContainerConfigurator;

return function(ContainerConfigurator $configurator) {
    // My specific logic

    // Saving the configuration as parameters
    $configurator->parameters()->set('some.prefix.host', $host);
    $configurator->parameters()->set('some.prefix.dbname', $dbname);
    // ...
};