Symfony2: Можно ли добавить конфигурацию для другого пакета через DependencyInjection?

В config.yml Symfony2 вы можете добавить «импорт», например:

imports:
    - { resource: services.yml }

Внутри моего services.yml у меня есть:

imports:
    security_bundle:
      resource: @AcmeSecurityBundle/Resources/config/services.yml

Однако альтернативный способ объявить службы для пакета — использовать DependencyInjection Extension, что устраняет необходимость импортировать что-либо в config.yml вручную, тем самым разделяя код.

namespace Acme\Bundle\SecurityBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;

class AcmeSecurityExtension extends Extension {

    public function load(array $configs, ContainerBuilder $container) {
        $loader = new YamlFileLoader(
            $container, new FileLocator(__DIR__ . '/../Resources/config')
        );
        $loader->load('services.yml');
    }

}

Вопрос:

liip_imagine:
    filter_sets:
      security_avatar_thumbnail:
        quality: 75
        filters:
          thumbnail: { size: [140, 140], mode: inset }

Затем Symfony жалуется, что

Нет расширения, способного загрузить конфигурацию для «liip_imagine».

Итак, кто-нибудь знает, есть ли способ добавить конфигурацию для стороннего пакета из другого пакета, не касаясь config.yml?


person Kasheen    schedule 14.02.2012    source источник


Ответы (3)


В Symfony 2.2 это возможно с помощью PrependExtensionInterface.

Взгляните на запись кулинарной книги «Как упростить настройку нескольких пакетов»:

http://symfony.com/doc/current/cookbook/bundles/prepend_extension.html

person dr.scre    schedule 12.03.2013
comment
Мне нужно это для FOSUserBundle! Теперь я могу создать на нем свое расширение и предварительно загрузить его с моей конфигурацией. Пример: $container-›prependExtensionConfig('fos_user', array( 'db_driver' =› 'orm' )); - person Steffen Brem; 19.11.2013

Я думаю, что это возможно, используя класс DependencyInjection\YourBundleExtension в вашем комплекте, а затем выполняя

public function load(array $configs, ContainerBuilder $container)
{
    ...
    $container->setParameter('the_bundle_parameter.you.want.to.override',$itsValue);
    ...
}

Но я действительно не знаю, является ли это лучшей практикой или нет...

person Yoann Chambonnet    schedule 29.02.2012
comment
Это не сработает, потому что то, что исходный постер пытается переопределить, не является параметром. Это будет работать только в том случае, если вы сможете убедить разработчика liip_imagine реорганизовать свой пакет, чтобы он работал с рядом параметров вместо семантической конфигурации (symfony.com/doc/current/cookbook/bundles/extension.html). Это было бы довольно много работы почти без пользы, и, вероятно, вообще никакой пользы для liip_imagine. - person Asa Ayers; 03.04.2012
comment
Я думаю, что ответ может заключаться в том, что это невозможно. Сейчас я просто импортирую файл config.yml уровня пакета в основной файл config.yml, чтобы моя конфигурация liip_imagine по-прежнему была инкапсулирована внутри пакета, к которому она относится. - person Kasheen; 18.04.2012

Я нашел решение поместить фильтры внутри бандла, а не в корневой config.yml

avalanche_imagine:
    web_root:     %kernel.root_dir%/../web
    cache_prefix: media/cache
    driver:       gd
    bundle: PathToYourBundleClass

AvalancheImagineExtension:load Добавьте это:

    $bundleClass = $container->getParameter("imagine.bundle");
    if ($bundleClass)
    {
        $bundle = new $bundleClass();
        $bundle->getContainerExtension()->load(array(), $container);
    }

AvalancheImagineExtension/Ресурсы/config/config.xml

<parameter key="imagine.bundle"></parameter>

Наконец, в вашем комплекте:

parameters:
    imagine.filters:
        image_main:
            type:    thumbnail
            options: { size: [490, 310], mode: outbound }
person Thommas    schedule 18.09.2012
comment
очень плохая идея, класс расширения ImagineBundle будет иметь метод load(), вызываемый дважды - один раз контейнером и один раз вашим кодом - person Adam Zielinski; 13.01.2014