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

в Symfony2 конфиг.yml вы можете добавить "импорт", например:

imports:
    - { resource: services.yml }

внутри моих услугах.yml у меня тогда есть:

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

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

namespace AcmeBundleSecurityBundleDependencyInjection;

use SymfonyComponentHttpKernelDependencyInjectionExtension;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentDependencyInjectionLoaderYamlFileLoader;
use SymfonyComponentConfigFileLocator;

class AcmeSecurityExtension extends Extension {

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

}

Вопрос Это отлично работает для деклараций служб, но, например, вы хотите, чтобы пакет настройте другой пакет, например adding LiipImagineBundle (как AvalancheImagineBundle) фильтры:

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

Symfony тогда жалуется, что

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

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

3 ответов


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

взгляните на запись поваренной книги" Как упростить конфигурацию нескольких пакетов":

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


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

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

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


Я нашел решение для размещения фильтров внутри пакета, а не в корневой конфигурации.в формате YML

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

AvalancheImagineExtension: загрузить добавить это:

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

AvalancheImagineExtension/Resources/config/config.в XML

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

наконец, в связке :

parameters:
    imagine.filters:
        image_main:
            type:    thumbnail
            options: { size: [490, 310], mode: outbound }