Symfony2: Is it possible to add configuration for another bundle via DependencyInjection?
-
29-04-2021 - |
题
In Symfony2's config.yml you can add an "import" such as:
imports:
- { resource: services.yml }
Inside my services.yml I then have:
imports:
security_bundle:
resource: @AcmeSecurityBundle/Resources/config/services.yml
However the alternative way to declare services for a bundle is by using a DependencyInjection
Extension
thus eliminating the need to import anything into config.yml manually thus decoupling the code.
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');
}
}
The Question
This works fine for service declarations but say for instance you want a bundle to configure another bundle such as adding LiipImagineBundle
(it's like AvalancheImagineBundle
) filters:
liip_imagine:
filter_sets:
security_avatar_thumbnail:
quality: 75
filters:
thumbnail: { size: [140, 140], mode: inset }
Symfony then complains that
There is no extension able to load the configuration for "liip_imagine"
So does anyone know if there is a way to add configuration for third party bundle from another bundle without touching config.yml
?
解决方案
In Symfony 2.2 it is possible with help of PrependExtensionInterface.
Take a look at the "How to simplify configuration of multiple Bundles" cookbook entry:
http://symfony.com/doc/current/cookbook/bundles/prepend_extension.html
其他提示
I think that is possible, using the DependencyInjection\YourBundleExtension class in your bundle, and then doing a
public function load(array $configs, ContainerBuilder $container)
{
...
$container->setParameter('the_bundle_parameter.you.want.to.override',$itsValue);
...
}
But I don't really know if it's best practice or not...
I found a solution to put filters inside the bundle instead of in the root config.yml
avalanche_imagine:
web_root: %kernel.root_dir%/../web
cache_prefix: media/cache
driver: gd
bundle: PathToYourBundleClass
AvalancheImagineExtension:load Add this :
$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>
Finally, in your bundle :
parameters:
imagine.filters:
image_main:
type: thumbnail
options: { size: [490, 310], mode: outbound }