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