grabbee
@grabbee

Как правильно конфигурировать сторонний бандл в своём?

Например LiipImagineBundle - у него много параметров нужно в его собственный конфиг прописать.

Я хочу сделать отдельный бандл в котором почти всё должно быть уже сконфигурировано.
Как это правильно сделать?

1. Импортировать файл конфига из своего бандла в приложение.
2. $container->prependExtensionConfig($name, $config);

Или как это вообще?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
@Flying
Переопределение конфигурации в Symfony вне основного процесса загрузки конфигурационных файлов - не самое простое дело. Этот процесс закрыт от прямой кастомизации т.к. основной процесс загрузки и обработки конфигурации bundles целиком отдан на откуп им самим. Причина подобных ограничений в том что загрузка конфигурации - один из самых ранних этапов работы и, как и для всех подобных частей кода - там довольно мало пространства для манёвров. В связи с этим путь (и сама возможность) переопределения конфигурации будет очень сильно зависеть от того что же именно вы хотите переопределить.

Для того чтобы лучше понять как это происходит - вам стоит подробнее изучить вопрос того как именно организована загрузка и обработка конфигурации в Symfony.

Если вкратце:
  1. В процессе конфигурации контейнера происходит сбор данных конфигурации из конфигурационных файлов. Эти данные сохраняются в container'е через ContainerBuilder::loadFromExtension().
  2. Далее, собранные данные передаются в качестве основы в bundle extension (через метод load()). То, как именно bundle extension будет работать с собранными данными - целиком зависит от кода bundle'а, так что в целом с ними может произойти всё что угодно.

Как вы, надеюсь, понимаете - из-за п.2 какого-то общего подхода к переопределению данных в Symfony не существует. Поэтому, как я уже писал выше, вам необходимо определиться с тем что именно вы хотите переопределить, а дальше смотреть на код загрузчика соответствующего bundle (вот он для LiipImagineBundle).

Как видно - в случае LiipImagineBundle в целом ничего страшного не происходит, полученная конфигурация сразу отправляется в processing и потом используется для регистрации сервисов и параметров.

Поскольку процесс сборки контейнера начинается с merge pass, то вы не можете вмешаться в этот процесс через compiler pass, как это делается обычно, однако вы можете воспользоваться вот этим куском логики для того чтобы добиться своей цели: вам достаточно определить в своём bundle собственный extension и отметить что он реализует PrependExtensionInterface. Это позволит вашему extension получить экземпляр ContainerBuilder до того как будут загружаться остальные extensions, именно это позволит вам воспользоваться ContainerBuilder::loadFromExtension() для добавления параметров конфигурации к нужному вам bundle.

Несколько нетривиально, но должно работать :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
grabbee
@grabbee Автор вопроса
Да. Кажется получилось.

# implements CompilerPassInterface

    public function process(ContainerBuilder $container)
    {
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config/packages'));
        $loader->load('liip_imagine.yaml');
    }


Оно загрузило всё сразу в контейнер.

PrependExtensionInterface prepend - не сработало. Ему нужны были параметры из services.yml самого бандла, а его загрузка идет после prepend, как я понял. process - срабатывает на уже готовом контейнере, и все параметры там есть. Сейчас буду понимать, всё ли правильно я делаю.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы