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