@@ -83,6 +83,7 @@ class PhpDumper extends Dumper
83
83
private $ inlinedRequires = [];
84
84
private $ circularReferences = [];
85
85
private $ singleUsePrivateIds = [];
86
+ private $ preload = [];
86
87
private $ addThrow = false ;
87
88
private $ addGetService = false ;
88
89
private $ locatedIds = [];
@@ -144,6 +145,7 @@ public function dump(array $options = [])
144
145
'hot_path_tag ' => 'container.hot_path ' ,
145
146
'inline_factories_parameter ' => 'container.dumper.inline_factories ' ,
146
147
'inline_class_loader_parameter ' => 'container.dumper.inline_class_loader ' ,
148
+ 'preload_classes ' => [],
147
149
'service_locator_tag ' => 'container.service_locator ' ,
148
150
'build_time ' => time (),
149
151
], $ options );
@@ -228,8 +230,12 @@ public function dump(array $options = [])
228
230
229
231
$ proxyClasses = $ this ->inlineFactories ? $ this ->generateProxyClasses () : null ;
230
232
233
+ if ($ options ['preload_classes ' ]) {
234
+ $ this ->preload = array_combine ($ options ['preload_classes ' ], $ options ['preload_classes ' ]);
235
+ }
236
+
231
237
$ code =
232
- $ this ->startClass ($ options ['class ' ], $ baseClass, $ preload ).
238
+ $ this ->startClass ($ options ['class ' ], $ baseClass ).
233
239
$ this ->addServices ($ services ).
234
240
$ this ->addDeprecatedAliases ().
235
241
$ this ->addDefaultParametersMethod ()
@@ -304,7 +310,7 @@ public function dump(array $options = [])
304
310
$ id = hash ('crc32 ' , $ hash .$ time );
305
311
$ this ->asFiles = false ;
306
312
307
- if ($ preload && null !== $ autoloadFile = $ this ->getAutoloadFile ()) {
313
+ if ($ this -> preload && null !== $ autoloadFile = $ this ->getAutoloadFile ()) {
308
314
$ autoloadFile = substr ($ this ->export ($ autoloadFile ), 2 , -1 );
309
315
310
316
$ code [$ options ['class ' ].'.preload.php ' ] = <<<EOF
@@ -322,8 +328,13 @@ public function dump(array $options = [])
322
328
323
329
EOF ;
324
330
325
- foreach ($ preload as $ class ) {
326
- $ code [$ options ['class ' ].'.preload.php ' ] .= sprintf ("\$classes[] = '%s'; \n" , $ class );
331
+ foreach ($ this ->preload as $ class ) {
332
+ if (!$ class || false !== strpos ($ class , '$ ' )) {
333
+ continue ;
334
+ }
335
+ if (!(class_exists ($ class , false ) || interface_exists ($ class , false ) || trait_exists ($ class , false )) || (new \ReflectionClass ($ class ))->isUserDefined ()) {
336
+ $ code [$ options ['class ' ].'.preload.php ' ] .= sprintf ("\$classes[] = '%s'; \n" , $ class );
337
+ }
327
338
}
328
339
329
340
$ code [$ options ['class ' ].'.preload.php ' ] .= <<<'EOF'
@@ -369,6 +380,7 @@ public function dump(array $options = [])
369
380
$ this ->circularReferences = [];
370
381
$ this ->locatedIds = [];
371
382
$ this ->exportedVariables = [];
383
+ $ this ->preload = [];
372
384
373
385
$ unusedEnvs = [];
374
386
foreach ($ this ->container ->getEnvCounters () as $ env => $ use ) {
@@ -547,8 +559,10 @@ private function addServiceInclude(string $cId, Definition $definition): string
547
559
if ($ this ->inlineRequires && (!$ this ->isHotPath ($ definition ) || $ this ->getProxyDumper ()->isProxyCandidate ($ definition ))) {
548
560
$ lineage = [];
549
561
foreach ($ this ->inlinedDefinitions as $ def ) {
550
- if (!$ def ->isDeprecated () && \is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())) {
551
- $ this ->collectLineage ($ class , $ lineage );
562
+ if (!$ def ->isDeprecated ()) {
563
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
564
+ $ this ->collectLineage ($ class , $ lineage );
565
+ }
552
566
}
553
567
}
554
568
@@ -557,9 +571,10 @@ private function addServiceInclude(string $cId, Definition $definition): string
557
571
&& ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE !== $ behavior
558
572
&& $ this ->container ->has ($ id )
559
573
&& $ this ->isTrivialInstance ($ def = $ this ->container ->findDefinition ($ id ))
560
- && \is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())
561
574
) {
562
- $ this ->collectLineage ($ class , $ lineage );
575
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
576
+ $ this ->collectLineage ($ class , $ lineage );
577
+ }
563
578
}
564
579
}
565
580
@@ -809,6 +824,12 @@ protected function {$methodName}($lazyInitialization)
809
824
810
825
if ($ definition ->isDeprecated ()) {
811
826
$ code .= sprintf (" trigger_deprecation('', '', %s); \n\n" , $ this ->export ($ definition ->getDeprecationMessage ($ id )));
827
+ } else {
828
+ foreach ($ this ->inlinedDefinitions as $ def ) {
829
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
830
+ $ this ->preload [$ class ] = $ class ;
831
+ }
832
+ }
812
833
}
813
834
814
835
if ($ this ->getProxyDumper ()->isProxyCandidate ($ definition )) {
@@ -965,7 +986,15 @@ private function addServices(array &$services = null): string
965
986
$ definitions = $ this ->container ->getDefinitions ();
966
987
ksort ($ definitions );
967
988
foreach ($ definitions as $ id => $ definition ) {
968
- $ services [$ id ] = $ definition ->isSynthetic () ? null : $ this ->addService ($ id , $ definition );
989
+ if (!$ definition ->isSynthetic ()) {
990
+ $ services [$ id ] = $ this ->addService ($ id , $ definition );
991
+ } else {
992
+ $ services [$ id ] = null ;
993
+
994
+ foreach ($ this ->getClasses ($ definition ) as $ class ) {
995
+ $ this ->preload [$ class ] = $ class ;
996
+ }
997
+ }
969
998
}
970
999
971
1000
foreach ($ definitions as $ id => $ definition ) {
@@ -1066,7 +1095,7 @@ private function addNewInstance(Definition $definition, string $return = '', str
1066
1095
return $ return .sprintf ('new %s(%s) ' , $ this ->dumpLiteralClass ($ this ->dumpValue ($ class )), implode (', ' , $ arguments )).$ tail ;
1067
1096
}
1068
1097
1069
- private function startClass (string $ class , string $ baseClass, ? array & $ preload ): string
1098
+ private function startClass (string $ class , string $ baseClass ): string
1070
1099
{
1071
1100
$ namespaceLine = !$ this ->asFiles && $ this ->namespace ? "\nnamespace {$ this ->namespace }; \n" : '' ;
1072
1101
@@ -1129,7 +1158,7 @@ public function __construct()
1129
1158
$ code .= $ this ->addMethodMap ();
1130
1159
$ code .= $ this ->asFiles && !$ this ->inlineFactories ? $ this ->addFileMap () : '' ;
1131
1160
$ code .= $ this ->addAliases ();
1132
- $ code .= $ this ->addInlineRequires ($ preload );
1161
+ $ code .= $ this ->addInlineRequires ();
1133
1162
$ code .= <<<EOF
1134
1163
}
1135
1164
@@ -1329,7 +1358,7 @@ protected function {$methodNameAlias}()
1329
1358
return $ code ;
1330
1359
}
1331
1360
1332
- private function addInlineRequires (? array & $ preload ): string
1361
+ private function addInlineRequires (): string
1333
1362
{
1334
1363
if (!$ this ->hotPathTag || !$ this ->inlineRequires ) {
1335
1364
return '' ;
@@ -1347,8 +1376,7 @@ private function addInlineRequires(?array &$preload): string
1347
1376
$ inlinedDefinitions = $ this ->getDefinitionsFromArguments ([$ definition ]);
1348
1377
1349
1378
foreach ($ inlinedDefinitions as $ def ) {
1350
- if (\is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())) {
1351
- $ preload [$ class ] = $ class ;
1379
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
1352
1380
$ this ->collectLineage ($ class , $ lineage );
1353
1381
}
1354
1382
}
@@ -2070,4 +2098,29 @@ private function getAutoloadFile(): ?string
2070
2098
2071
2099
return null ;
2072
2100
}
2101
+
2102
+ private function getClasses (Definition $ definition ): array
2103
+ {
2104
+ $ classes = [];
2105
+
2106
+ while ($ definition instanceof Definition) {
2107
+ $ classes [] = trim ($ definition ->getClass (), '\\' );
2108
+ $ factory = $ definition ->getFactory ();
2109
+
2110
+ if (!\is_array ($ factory )) {
2111
+ $ factory = [$ factory ];
2112
+ }
2113
+
2114
+ if (\is_string ($ factory [0 ])) {
2115
+ if (false !== $ i = strrpos ($ factory [0 ], ':: ' )) {
2116
+ $ factory [0 ] = substr ($ factory [0 ], 0 , $ i );
2117
+ }
2118
+ $ classes [] = trim ($ factory [0 ], '\\' );
2119
+ }
2120
+
2121
+ $ definition = $ factory [0 ];
2122
+ }
2123
+
2124
+ return array_filter ($ classes );
2125
+ }
2073
2126
}
0 commit comments