Skip to content

Commit cb39a7f

Browse files
minor symfony#49684 [DependencyInjection] Use weak references in ContainerBuilder (nicolas-grekas)
This PR was merged into the 6.3 branch. Discussion ---------- [DependencyInjection] Use weak references in ContainerBuilder | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | no | New feature? | no | Deprecations? | no | Tickets | - | License | MIT | Doc PR | - Same as symfony#48469 for ContainerBuilder. Commits ------- 749d4b9 [DependencyInjection] Use weak references in ContainerBuilder
2 parents 64b4574 + 749d4b9 commit cb39a7f

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
140140
*/
141141
private array $removedBindingIds = [];
142142

143+
private \WeakReference $containerRef;
144+
143145
private const INTERNAL_TYPES = [
144146
'int' => true,
145147
'float' => true,
@@ -1050,13 +1052,14 @@ private function createService(Definition $definition, array &$inlineServices, b
10501052
$parameterBag = $this->getParameterBag();
10511053

10521054
if (true === $tryProxy && $definition->isLazy() && !$tryProxy = !($proxy = $this->proxyInstantiator ??= new LazyServiceInstantiator()) || $proxy instanceof RealServiceInstantiator) {
1055+
$containerRef = $this->containerRef ??= \WeakReference::create($this);
10531056
$proxy = $proxy->instantiateProxy(
10541057
$this,
10551058
(clone $definition)
10561059
->setClass($parameterBag->resolveValue($definition->getClass()))
10571060
->setTags(($definition->hasTag('proxy') ? ['proxy' => $parameterBag->resolveValue($definition->getTag('proxy'))] : []) + $definition->getTags()),
1058-
$id, function ($proxy = false) use ($definition, &$inlineServices, $id) {
1059-
return $this->createService($definition, $inlineServices, true, $id, $proxy);
1061+
$id, static function ($proxy = false) use ($containerRef, $definition, &$inlineServices, $id) {
1062+
return $containerRef->get()->createService($definition, $inlineServices, true, $id, $proxy);
10601063
}
10611064
);
10621065
$this->shareService($definition, $proxy, $id, $inlineServices);
@@ -1184,34 +1187,38 @@ private function doResolveServices(mixed $value, array &$inlineServices = [], bo
11841187
$value[$k] = $this->doResolveServices($v, $inlineServices, $isConstructorArgument);
11851188
}
11861189
} elseif ($value instanceof ServiceClosureArgument) {
1190+
$containerRef = $this->containerRef ??= \WeakReference::create($this);
11871191
$reference = $value->getValues()[0];
1188-
$value = fn () => $this->resolveServices($reference);
1192+
$value = static fn () => $containerRef->get()->resolveServices($reference);
11891193
} elseif ($value instanceof IteratorArgument) {
1190-
$value = new RewindableGenerator(function () use ($value, &$inlineServices) {
1194+
$containerRef = $this->containerRef ??= \WeakReference::create($this);
1195+
$value = new RewindableGenerator(static function () use ($containerRef, $value, &$inlineServices) {
1196+
$container = $containerRef->get();
11911197
foreach ($value->getValues() as $k => $v) {
11921198
foreach (self::getServiceConditionals($v) as $s) {
1193-
if (!$this->has($s)) {
1199+
if (!$container->has($s)) {
11941200
continue 2;
11951201
}
11961202
}
11971203
foreach (self::getInitializedConditionals($v) as $s) {
1198-
if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE, $inlineServices)) {
1204+
if (!$container->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE, $inlineServices)) {
11991205
continue 2;
12001206
}
12011207
}
12021208

1203-
yield $k => $this->doResolveServices($v, $inlineServices);
1209+
yield $k => $container->doResolveServices($v, $inlineServices);
12041210
}
1205-
}, function () use ($value): int {
1211+
}, static function () use ($containerRef, $value): int {
1212+
$container = $containerRef->get();
12061213
$count = 0;
12071214
foreach ($value->getValues() as $v) {
12081215
foreach (self::getServiceConditionals($v) as $s) {
1209-
if (!$this->has($s)) {
1216+
if (!$container->has($s)) {
12101217
continue 2;
12111218
}
12121219
}
12131220
foreach (self::getInitializedConditionals($v) as $s) {
1214-
if (!$this->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE)) {
1221+
if (!$container->doGet($s, ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE)) {
12151222
continue 2;
12161223
}
12171224
}

0 commit comments

Comments
 (0)