Symfony项目中如何从自定义bundle向默认Pomm会话注册自定义转换器
解决方案
首先删除你在bundle中额外声明的非默认会话,多会话是导致模型匹配异常、抛出ConverterException的直接原因,pomm-bundle会根据模型对应的数据库连接配置自动匹配会话,多个同配置会话会出现匹配优先级混乱的问题。
你提到的CompilerPass是正确的实现路径,pomm-bundle ~2.4版本的默认会话转换器注册可以按以下步骤实现:
步骤1:在Bundle入口类注册CompilerPass
在你自定义bundle的入口类(继承Symfony内核Bundle类的文件)中添加CompilerPass注册逻辑:
// src/Vendor/YourPommBundle/VendorYourPommBundle.php namespace Vendor\YourPommBundle; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; use Vendor\YourPommBundle\DependencyInjection\Compiler\AddPommConverterPass; class VendorYourPommBundle extends Bundle { public function build(ContainerBuilder $container): void { parent::build($container); $container->addCompilerPass(new AddPommConverterPass()); } }
步骤2:实现CompilerPass逻辑
pomm-bundle的默认会话对应转换器容器服务id为pomm.session.default.converter_holder,直接在CompilerPass中对该服务注入转换器注册逻辑即可:
// src/Vendor/YourPommBundle/DependencyInjection/Compiler/AddPommConverterPass.php namespace Vendor\YourPommBundle\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; class AddPommConverterPass implements CompilerPassInterface { public function process(ContainerBuilder $container): void { // 兼容pomm-bundle未启用的场景,避免报错 if (!$container->hasDefinition('pomm.session.default.converter_holder')) { return; } $converterHolder = $container->getDefinition('pomm.session.default.converter_holder'); // 注册自定义转换器,参数分别为PostgreSQL类型名、转换器服务引用、可选PHP侧类型别名 $converterHolder->addMethodCall('addConverter', [ 'public.validation_type', new Reference('your_bundle.converter.validation_type') ]); // 多转换器可重复调用addMethodCall注册 } }
步骤3:注册转换器服务
在你的bundle的服务配置文件中声明自定义转换器为服务即可:
# src/Vendor/YourPommBundle/Resources/config/services.yaml services: your_bundle.converter.validation_type: class: Vendor\YourPommBundle\Converter\ValidationTypeConverter # 按需声明依赖参数 public: false
完成上述配置后清空Symfony缓存,默认会话会自动加载你bundle中注册的所有转换器,不会再出现会话匹配异常的问题。
内容的提问来源于stack exchange,提问作者DjLeChuck
相关产品推荐
相关产品推荐

