Skip to content

Commit 76e8814

Browse files
committed
Add ExtensionInterface::build() to register compiler passes
1 parent 52a9292 commit 76e8814

File tree

10 files changed

+67
-1
lines changed

10 files changed

+67
-1
lines changed

UPGRADE-6.4.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
UPGRADE FROM 6.3 to 6.4
22
=======================
33

4+
DependencyInjection
5+
-------------------
6+
7+
* Add `ExtensionInterface::build(ContainerBuilder $container): void` to register compiler passes from an extension
8+
49
DoctrineBridge
510
--------------
611

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/ExtensionWithoutConfigTestBundle/DependencyInjection/ExtensionWithoutConfigTestExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717
class ExtensionWithoutConfigTestExtension implements ExtensionInterface
1818
{
19+
public function build(ContainerBuilder $container): void
20+
{
21+
}
22+
1923
public function load(array $configs, ContainerBuilder $container): void
2024
{
2125
}

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AppKernel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public function registerContainerConfiguration(LoaderInterface $loader): void
7878
$loader->load($this->rootConfig);
7979
}
8080

81-
protected function build(ContainerBuilder $container): void
81+
public function build(ContainerBuilder $container): void
8282
{
8383
$container->register('logger', NullLogger::class);
8484
$container->registerExtension(new TestDumpExtension());

src/Symfony/Component/DependencyInjection/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
6.4
5+
---
6+
7+
* Add `ExtensionInterface::build(ContainerBuilder $container): void` to register compiler passes from an extension.
8+
49
6.3
510
---
611

src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,13 @@ public function deprecateParameter(string $name, string $package, string $versio
751751
*/
752752
public function compile(bool $resolveEnvPlaceholders = false)
753753
{
754+
foreach ($this->extensions as $extension) {
755+
// @deprecated remove if statement in Symfony 7
756+
if (method_exists($extension, 'build') && is_callable([$extension, 'build'])) {
757+
$extension->build($this);
758+
}
759+
}
760+
754761
$compiler = $this->getCompiler();
755762

756763
if ($this->trackResources) {

src/Symfony/Component/DependencyInjection/Extension/Extension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn
2828
{
2929
private array $processedConfigs = [];
3030

31+
public function build(ContainerBuilder $container): void
32+
{
33+
}
34+
3135
/**
3236
* @return string|false
3337
*/

src/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
/**
1717
* ExtensionInterface is the interface implemented by container extension classes.
1818
*
19+
* @method void build(ContainerBuilder $container) Called just before compilation, use this to register compiler passes
20+
*
1921
* @author Fabien Potencier <fabien@symfony.com>
2022
*/
2123
interface ExtensionInterface

src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
4040
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
4141
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
42+
use Symfony\Component\DependencyInjection\Extension\Extension;
4243
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
4344
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInstantiator;
4445
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
@@ -1326,6 +1327,17 @@ public function testExtensionConfig()
13261327
$this->assertEquals([$second, $first], $configs);
13271328
}
13281329

1330+
public function testExtensionBuild()
1331+
{
1332+
$container = new ContainerBuilder();
1333+
1334+
$container->registerExtension(new BuildExtension());
1335+
1336+
$container->compile();
1337+
$testpass = array_filter($container->getCompilerPassConfig()->getPasses(), fn ($pass) => $pass instanceof TestPass);
1338+
$this->assertCount(1, $testpass, 'The extension did not register a compiler pass.');
1339+
}
1340+
13291341
public function testAbstractAlias()
13301342
{
13311343
$container = new ContainerBuilder();
@@ -2065,3 +2077,22 @@ public function __construct($first = '', $second = '')
20652077
$this->second = $second;
20662078
}
20672079
}
2080+
2081+
class BuildExtension extends Extension
2082+
{
2083+
public function load(array $configs, ContainerBuilder $container): void
2084+
{
2085+
}
2086+
2087+
public function build(ContainerBuilder $container): void
2088+
{
2089+
$container->addCompilerPass(new TestPass());
2090+
}
2091+
}
2092+
2093+
class TestPass implements CompilerPassInterface
2094+
{
2095+
public function process(ContainerBuilder $container): void
2096+
{
2097+
}
2098+
}

src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/AcmeExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ public function getAlias(): string
2424
{
2525
return 'acme';
2626
}
27+
28+
public function build(ContainerBuilder $container): void
29+
{
30+
}
2731
}

src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ public function getAlias(): string
4141
public function getConfiguration(array $config, ContainerBuilder $container)
4242
{
4343
}
44+
45+
public function build(ContainerBuilder $container): void
46+
{
47+
}
4448
}

0 commit comments

Comments
 (0)