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

В 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');
    }

}

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 13 марта 2013

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

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

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

0 голосов
/ 18 сентября 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.xml

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

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

parameters:
    imagine.filters:
        image_main:
            type:    thumbnail
            options: { size: [490, 310], mode: outbound }
0 голосов
/ 01 марта 2012

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

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

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

...