使用自定义容器扩展/编译器传递中声明的容器参数配置 Symfony 3rd 方包
Posted
技术标签:
【中文标题】使用自定义容器扩展/编译器传递中声明的容器参数配置 Symfony 3rd 方包【英文标题】:Configure Symfony 3rd party bundle with container parameters declared in custom container extension / compiler pass 【发布时间】:2021-11-20 13:42:44 【问题描述】:我想将 Doctrine 包 配置为具有 DBAL 连接。出于某种原因,配置需要一些逻辑来检索。我尝试使用container extension 和compiler pass 在编译容器时执行逻辑并将配置存储为容器参数。
在我的尝试中,我在 Kernel 类中注册了扩展和编译器通道:
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 和 Doctrine bundle 2.4。
为什么我的参数对于 3rd 方捆绑配置似乎无法访问? 我怎样才能完成这项工作? 有没有更好的方法来实现这一点?【问题讨论】:
【参考方案1】:我认为 Doctrine 捆绑配置在我的编译器传递可以声明参数之前得到处理。使用 DependencyInjection 组件可能无法解决。
通过在services.yaml中导入PHP配置文件解决:
imports:
- resource: my_custom_file.php
内容如下:
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
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);
// ...
;
【讨论】:
以上是关于使用自定义容器扩展/编译器传递中声明的容器参数配置 Symfony 3rd 方包的主要内容,如果未能解决你的问题,请参考以下文章
工作流中容器化的依赖注入!Activiti集成CDI实现工作流的可配置型和可扩展型