Переопределение конфигурации расширения с помощью компилятора

#symfony #api-platform.com

#symfony #api-platform.com

Вопрос:

Надеюсь, у вас все хорошо, я пытаюсь переопределить существующую конфигурацию платформы 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());
    }
}
  

Проблема в том, что моя новая конфигурация не учитывается и не работает должным образом.

Ответ №1:

Я не думаю, что вы хотите использовать CompilerPass для этого. Я думаю, вы хотите использовать PrependExtensionInterface и prepend метод. (см 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);
    }
}
  

Возможно, я ошибся в некоторых деталях, но это может дать вам начало правильного подхода.

Комментарии:

1. Добавить ! добавить новую конфигурацию перед старой ?