You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony6.2自定义Bundle迁移遇InvalidConfigurationException问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:20:27