使用自定义容器扩展/编译器传递中声明的容器参数配置 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.3Doctrine 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实现工作流的可配置型和可扩展型

转JSP中的9大隐藏对象

Dubbo3高级特性「框架与服务」自定义Dubbo服务容器及扩展容器实现分析

STL容器自定义内存分配器

STL容器自定义内存分配器

STL容器自定义内存分配器