@@ -140,6 +140,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
140
140
*/
141
141
private array $ removedBindingIds = [];
142
142
143
+ private \WeakReference $ containerRef ;
144
+
143
145
private const INTERNAL_TYPES = [
144
146
'int ' => true ,
145
147
'float ' => true ,
@@ -1050,13 +1052,14 @@ private function createService(Definition $definition, array &$inlineServices, b
1050
1052
$ parameterBag = $ this ->getParameterBag ();
1051
1053
1052
1054
if (true === $ tryProxy && $ definition ->isLazy () && !$ tryProxy = !($ proxy = $ this ->proxyInstantiator ??= new LazyServiceInstantiator ()) || $ proxy instanceof RealServiceInstantiator) {
1055
+ $ containerRef = $ this ->containerRef ??= \WeakReference::create ($ this );
1053
1056
$ proxy = $ proxy ->instantiateProxy (
1054
1057
$ this ,
1055
1058
(clone $ definition )
1056
1059
->setClass ($ parameterBag ->resolveValue ($ definition ->getClass ()))
1057
1060
->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 );
1060
1063
}
1061
1064
);
1062
1065
$ this ->shareService ($ definition , $ proxy , $ id , $ inlineServices );
@@ -1184,34 +1187,38 @@ private function doResolveServices(mixed $value, array &$inlineServices = [], bo
1184
1187
$ value [$ k ] = $ this ->doResolveServices ($ v , $ inlineServices , $ isConstructorArgument );
1185
1188
}
1186
1189
} elseif ($ value instanceof ServiceClosureArgument) {
1190
+ $ containerRef = $ this ->containerRef ??= \WeakReference::create ($ this );
1187
1191
$ reference = $ value ->getValues ()[0 ];
1188
- $ value = fn () => $ this ->resolveServices ($ reference );
1192
+ $ value = static fn () => $ containerRef -> get () ->resolveServices ($ reference );
1189
1193
} 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 ();
1191
1197
foreach ($ value ->getValues () as $ k => $ v ) {
1192
1198
foreach (self ::getServiceConditionals ($ v ) as $ s ) {
1193
- if (!$ this ->has ($ s )) {
1199
+ if (!$ container ->has ($ s )) {
1194
1200
continue 2 ;
1195
1201
}
1196
1202
}
1197
1203
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 )) {
1199
1205
continue 2 ;
1200
1206
}
1201
1207
}
1202
1208
1203
- yield $ k => $ this ->doResolveServices ($ v , $ inlineServices );
1209
+ yield $ k => $ container ->doResolveServices ($ v , $ inlineServices );
1204
1210
}
1205
- }, function () use ($ value ): int {
1211
+ }, static function () use ($ containerRef , $ value ): int {
1212
+ $ container = $ containerRef ->get ();
1206
1213
$ count = 0 ;
1207
1214
foreach ($ value ->getValues () as $ v ) {
1208
1215
foreach (self ::getServiceConditionals ($ v ) as $ s ) {
1209
- if (!$ this ->has ($ s )) {
1216
+ if (!$ container ->has ($ s )) {
1210
1217
continue 2 ;
1211
1218
}
1212
1219
}
1213
1220
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 )) {
1215
1222
continue 2 ;
1216
1223
}
1217
1224
}
0 commit comments