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 }