Symfony6.2自定义Bundle迁移遇InvalidConfigurationException问题求助
问题场景
将Symfony3自定义Bundle迁移至Symfony6.2后,触发InvalidConfigurationException,报错信息:
Unrecognized options "provider, timeout, apikey, default_options" under "schoenef_html_to_pdf". Available options are "".
相关代码包含继承AbstractBundle的Bundle类、传统的Extension和Configuration类。
原因分析
Symfony 5.4+引入的AbstractBundle会替代传统Extension/Configuration类的自动加载逻辑,默认不会识别你手动创建的SchoenefHtmlToPdfExtension,导致配置树未被容器注册,因此配置选项被判定为无效。
解决方案
方案一:改用AbstractBundle内置配置处理(推荐)
直接在Bundle类中实现配置定义和扩展加载,删除独立的Extension和Configuration类:
修改src/SchoenefHtmlToPdfBundle.php:
<?php namespace Schoenef\HtmlToPdfBundle; use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\HttpKernel\Bundle\AbstractBundle; class SchoenefHtmlToPdfBundle extends AbstractBundle { public function configure(DefinitionConfigurator $definition): void { $pageSizes = [ 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'C5E', 'Comm10E', 'DLE', 'Executive', 'Folio', 'Ledger', 'Legal', 'Letter', 'Tabloid' ]; $definition->rootNode() ->children() ->enumNode('provider')->values(['pdfrocket'])->defaultValue('pdfrocket')->end() ->integerNode('timeout')->defaultValue(20)->end() ->scalarNode('apikey')->isRequired()->end() ->arrayNode('default_options') ->children() ->integerNode('dpi')->end() ->floatNode('zoom')->end() ->integerNode('js_delay')->end() ->booleanNode('shrinking')->defaultTrue()->end() ->integerNode('image_quality')->end() ->enumNode('page_size')->values($pageSizes)->end() ->end() ->end() ->end(); } public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void { // 加载服务配置文件 $container->import('../config/services.yml'); // 若需将配置参数注入服务,可在此添加逻辑 // 示例:$builder->setParameter('schoenef_html_to_pdf.apikey', $config['apikey']); } }
随后删除src/DependencyInjection/SchoenefHtmlToPdfExtension.php和src/DependencyInjection/Configuration.php。
方案二:保留传统Extension/Configuration
如果希望继续使用现有Extension和Configuration类,修改Bundle类,显式指定要使用的Extension:
修改src/SchoenefHtmlToPdfBundle.php:
<?php namespace Schoenef\HtmlToPdfBundle; use Schoenef\HtmlToPdfBundle\DependencyInjection\SchoenefHtmlToPdfExtension; use Symfony\Component\HttpKernel\Bundle\AbstractBundle; class SchoenefHtmlToPdfBundle extends AbstractBundle { public function getContainerExtension(): SchoenefHtmlToPdfExtension { return new SchoenefHtmlToPdfExtension(); } }
这样AbstractBundle会加载你手动创建的Extension,Configuration定义的配置树会被正确注册。
内容的提问来源于stack exchange,提问作者Andreas

