【问题标题】:Override extension configuration via compiler pass通过编译器传递覆盖扩展配置
【发布时间】:2021-01-19 00:36:38
【问题描述】:

希望你做得很好,我正在尝试通过某种自定义 Compiler Pass 覆盖现有的 api 平台配置 api_platform.mapping.paths

目标是将我的新配置与现有配置合并

这是我想在容器的复杂度高度更新它的配置部分:

# api/config/packages/api_platform.yaml
api_platform:

    mapping:
        # The list of paths with files or directories where the bundle will look for additional resource files.
        paths: []

这是我的自定义编译器传递:

/**
 * Class MergeApiMappingPathsConfigurationPass.
 */
class MergeApiMappingPathsConfigurationPass implements CompilerPassInterface
{
    /**
     * {@inheritdoc}
     */
    public function process(ContainerBuilder $container)
    {

        $configs = $container->getExtensionConfig('api_platform');
        $configs[0]['mapping']['paths'] = array_merge($configs[0]['mapping']['paths'], [__DIR__.'/../../Resources/resources/']);
        $container->prependExtensionConfig('api_platform', $configs[0]);

    }
}

这是我注册新的自定义编译器的根包:

class DemoBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {

        parent::build($container);
        $container->addCompilerPass(new MergeApiMappingPathsConfigurationPass());
    }
}

我的新配置没有考虑到无法正常工作的问题。

【问题讨论】:

    标签: symfony api-platform.com


    【解决方案1】:

    我认为您不想为此使用 CompilerPass。我想你想使用PrependExtensionInterfaceprepend 方法。 (见https://symfony.com/doc/current/bundles/prepend_extension.html

    类似

    class DemoBundleExtension extends Extension implements PrependExtensionInterface
    {
        public function prepend(ContainerBuilder $container)
        {
            if (!isset($container->getExtensions()['api_platform'])) {
                return;
            }
            $configs = $container->getExtensionConfig('api_platform');
            $configs[0]['mapping']['paths'] = array_merge($configs[0]['mapping']['paths'], [__DIR__.'/../../Resources/resources/']);
            $container->prependExtensionConfig('api_platform', ['mapping' => $configs]);
        }
    
        public function build(ContainerBuilder $container)
        {
            parent::build($container);
        }
    }
    

    我可能有一些细节错误,但这可能会让你开始正确的方法。

    【讨论】:

    • 前置!在旧配置之前添加新配置?
    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多