Skip to content

Commit ff75e32

Browse files
committed
bug symfony#21057 [DI] Auto register extension configuration classes as a resource (ro0NL)
This PR was merged into the 2.7 branch. Discussion ---------- [DI] Auto register extension configuration classes as a resource | Q | A | ------------- | --- | Branch? | 2.7 | Bug fix? | no | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #... <!-- #-prefixed issue number(s), if any --> | License | MIT | Doc PR | symfony/symfony-docs#... <!--highly recommended for new features--> Auto-register an extension configuration class as a resource from a compiler pass; not implicitly by the base extension class. Causing some extensions to register its configuration, whereas others dont (e.g. framework bundle). Fixes consistent cache invalidation whenever a configuration definition changes. Commits ------- 142416b [DI] Auto register extension configuration classes as a resource
2 parents 298060d + 142416b commit ff75e32

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\DependencyInjection\Compiler;
1313

1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
15+
use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
1516
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
1617

1718
/**
@@ -47,6 +48,9 @@ public function process(ContainerBuilder $container)
4748
$tmpContainer = new ContainerBuilder($container->getParameterBag());
4849
$tmpContainer->setResourceTracking($container->isTrackingResources());
4950
$tmpContainer->addObjectResource($extension);
51+
if ($extension instanceof ConfigurationExtensionInterface && null !== $configuration = $extension->getConfiguration($config, $tmpContainer)) {
52+
$tmpContainer->addObjectResource($configuration);
53+
}
5054

5155
foreach ($exprLangProviders as $provider) {
5256
$tmpContainer->addExpressionLanguageProvider($provider);

src/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111

1212
namespace Symfony\Component\DependencyInjection\Tests\Compiler;
1313

14+
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
15+
use Symfony\Component\Config\Definition\ConfigurationInterface;
16+
use Symfony\Component\Config\Resource\FileResource;
1417
use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass;
1518
use Symfony\Component\DependencyInjection\ContainerBuilder;
1619
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
@@ -48,4 +51,32 @@ public function testExpressionLanguageProviderForwarding()
4851

4952
$this->assertEquals(array($provider), $tmpProviders);
5053
}
54+
55+
public function testExtensionConfigurationIsTrackedByDefault()
56+
{
57+
$extension = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\Extension\\Extension')->getMock();
58+
$extension->expects($this->once())
59+
->method('getConfiguration')
60+
->will($this->returnValue(new FooConfiguration()));
61+
$extension->expects($this->any())
62+
->method('getAlias')
63+
->will($this->returnValue('foo'));
64+
65+
$container = new ContainerBuilder(new ParameterBag());
66+
$container->registerExtension($extension);
67+
$container->prependExtensionConfig('foo', array('bar' => true));
68+
69+
$pass = new MergeExtensionConfigurationPass();
70+
$pass->process($container);
71+
72+
$this->assertContains(new FileResource(__FILE__), $container->getResources(), '', false, false);
73+
}
74+
}
75+
76+
class FooConfiguration implements ConfigurationInterface
77+
{
78+
public function getConfigTreeBuilder()
79+
{
80+
return new TreeBuilder();
81+
}
5182
}

0 commit comments

Comments
 (0)