@@ -81,6 +81,7 @@ class PhpDumper extends Dumper
81
81
private $ inlinedRequires = [];
82
82
private $ circularReferences = [];
83
83
private $ singleUsePrivateIds = [];
84
+ private $ preload = [];
84
85
private $ addThrow = false ;
85
86
private $ addGetService = false ;
86
87
private $ locatedIds = [];
@@ -142,6 +143,7 @@ public function dump(array $options = [])
142
143
'hot_path_tag ' => 'container.hot_path ' ,
143
144
'inline_factories_parameter ' => 'container.dumper.inline_factories ' ,
144
145
'inline_class_loader_parameter ' => 'container.dumper.inline_class_loader ' ,
146
+ 'preload_classes ' => [],
145
147
'service_locator_tag ' => 'container.service_locator ' ,
146
148
'build_time ' => time (),
147
149
], $ options );
@@ -226,8 +228,12 @@ public function dump(array $options = [])
226
228
227
229
$ proxyClasses = $ this ->inlineFactories ? $ this ->generateProxyClasses () : null ;
228
230
231
+ if ($ options ['preload_classes ' ]) {
232
+ $ this ->preload = array_combine ($ options ['preload_classes ' ], $ options ['preload_classes ' ]);
233
+ }
234
+
229
235
$ code =
230
- $ this ->startClass ($ options ['class ' ], $ baseClass, $ preload ).
236
+ $ this ->startClass ($ options ['class ' ], $ baseClass ).
231
237
$ this ->addServices ($ services ).
232
238
$ this ->addDeprecatedAliases ().
233
239
$ this ->addDefaultParametersMethod ()
@@ -302,7 +308,7 @@ public function dump(array $options = [])
302
308
$ id = hash ('crc32 ' , $ hash .$ time );
303
309
$ this ->asFiles = false ;
304
310
305
- if ($ preload && null !== $ autoloadFile = $ this ->getAutoloadFile ()) {
311
+ if ($ this -> preload && null !== $ autoloadFile = $ this ->getAutoloadFile ()) {
306
312
$ autoloadFile = substr ($ this ->export ($ autoloadFile ), 2 , -1 );
307
313
308
314
$ code [$ options ['class ' ].'.preload.php ' ] = <<<EOF
@@ -320,8 +326,13 @@ public function dump(array $options = [])
320
326
321
327
EOF ;
322
328
323
- foreach ($ preload as $ class ) {
324
- $ code [$ options ['class ' ].'.preload.php ' ] .= sprintf ("\$classes[] = '%s'; \n" , $ class );
329
+ foreach ($ this ->preload as $ class ) {
330
+ if (!$ class || false !== strpos ($ class , '$ ' )) {
331
+ continue ;
332
+ }
333
+ if (!(class_exists ($ class , false ) || interface_exists ($ class , false ) || trait_exists ($ class , false )) || (new \ReflectionClass ($ class ))->isUserDefined ()) {
334
+ $ code [$ options ['class ' ].'.preload.php ' ] .= sprintf ("\$classes[] = '%s'; \n" , $ class );
335
+ }
325
336
}
326
337
327
338
$ code [$ options ['class ' ].'.preload.php ' ] .= <<<'EOF'
@@ -367,6 +378,7 @@ public function dump(array $options = [])
367
378
$ this ->circularReferences = [];
368
379
$ this ->locatedIds = [];
369
380
$ this ->exportedVariables = [];
381
+ $ this ->preload = [];
370
382
371
383
$ unusedEnvs = [];
372
384
foreach ($ this ->container ->getEnvCounters () as $ env => $ use ) {
@@ -542,8 +554,10 @@ private function addServiceInclude(string $cId, Definition $definition): string
542
554
if ($ this ->inlineRequires && (!$ this ->isHotPath ($ definition ) || $ this ->getProxyDumper ()->isProxyCandidate ($ definition ))) {
543
555
$ lineage = [];
544
556
foreach ($ this ->inlinedDefinitions as $ def ) {
545
- if (!$ def ->isDeprecated () && \is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())) {
546
- $ this ->collectLineage ($ class , $ lineage );
557
+ if (!$ def ->isDeprecated ()) {
558
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
559
+ $ this ->collectLineage ($ class , $ lineage );
560
+ }
547
561
}
548
562
}
549
563
@@ -552,9 +566,10 @@ private function addServiceInclude(string $cId, Definition $definition): string
552
566
&& ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE !== $ behavior
553
567
&& $ this ->container ->has ($ id )
554
568
&& $ this ->isTrivialInstance ($ def = $ this ->container ->findDefinition ($ id ))
555
- && \is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())
556
569
) {
557
- $ this ->collectLineage ($ class , $ lineage );
570
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
571
+ $ this ->collectLineage ($ class , $ lineage );
572
+ }
558
573
}
559
574
}
560
575
@@ -804,6 +819,12 @@ protected function {$methodName}($lazyInitialization)
804
819
805
820
if ($ definition ->isDeprecated ()) {
806
821
$ code .= sprintf (" @trigger_error(%s, E_USER_DEPRECATED); \n\n" , $ this ->export ($ definition ->getDeprecationMessage ($ id )));
822
+ } else {
823
+ foreach ($ this ->inlinedDefinitions as $ def ) {
824
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
825
+ $ this ->preload [$ class ] = $ class ;
826
+ }
827
+ }
807
828
}
808
829
809
830
if ($ this ->getProxyDumper ()->isProxyCandidate ($ definition )) {
@@ -960,7 +981,15 @@ private function addServices(array &$services = null): string
960
981
$ definitions = $ this ->container ->getDefinitions ();
961
982
ksort ($ definitions );
962
983
foreach ($ definitions as $ id => $ definition ) {
963
- $ services [$ id ] = $ definition ->isSynthetic () ? null : $ this ->addService ($ id , $ definition );
984
+ if (!$ definition ->isSynthetic ()) {
985
+ $ services [$ id ] = $ this ->addService ($ id , $ definition );
986
+ } else {
987
+ $ services [$ id ] = null ;
988
+
989
+ foreach ($ this ->getClasses ($ definition ) as $ class ) {
990
+ $ this ->preload [$ class ] = $ class ;
991
+ }
992
+ }
964
993
}
965
994
966
995
foreach ($ definitions as $ id => $ definition ) {
@@ -1061,7 +1090,7 @@ private function addNewInstance(Definition $definition, string $return = '', str
1061
1090
return $ return .sprintf ('new %s(%s) ' , $ this ->dumpLiteralClass ($ this ->dumpValue ($ class )), implode (', ' , $ arguments )).$ tail ;
1062
1091
}
1063
1092
1064
- private function startClass (string $ class , string $ baseClass, ? array & $ preload ): string
1093
+ private function startClass (string $ class , string $ baseClass ): string
1065
1094
{
1066
1095
$ namespaceLine = !$ this ->asFiles && $ this ->namespace ? "\nnamespace {$ this ->namespace }; \n" : '' ;
1067
1096
@@ -1124,7 +1153,7 @@ public function __construct()
1124
1153
$ code .= $ this ->addMethodMap ();
1125
1154
$ code .= $ this ->asFiles && !$ this ->inlineFactories ? $ this ->addFileMap () : '' ;
1126
1155
$ code .= $ this ->addAliases ();
1127
- $ code .= $ this ->addInlineRequires ($ preload );
1156
+ $ code .= $ this ->addInlineRequires ();
1128
1157
$ code .= <<<EOF
1129
1158
}
1130
1159
@@ -1324,7 +1353,7 @@ protected function {$methodNameAlias}()
1324
1353
return $ code ;
1325
1354
}
1326
1355
1327
- private function addInlineRequires (? array & $ preload ): string
1356
+ private function addInlineRequires (): string
1328
1357
{
1329
1358
if (!$ this ->hotPathTag || !$ this ->inlineRequires ) {
1330
1359
return '' ;
@@ -1342,8 +1371,7 @@ private function addInlineRequires(?array &$preload): string
1342
1371
$ inlinedDefinitions = $ this ->getDefinitionsFromArguments ([$ definition ]);
1343
1372
1344
1373
foreach ($ inlinedDefinitions as $ def ) {
1345
- if (\is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())) {
1346
- $ preload [$ class ] = $ class ;
1374
+ foreach ($ this ->getClasses ($ def ) as $ class ) {
1347
1375
$ this ->collectLineage ($ class , $ lineage );
1348
1376
}
1349
1377
}
@@ -2065,4 +2093,29 @@ private function getAutoloadFile(): ?string
2065
2093
2066
2094
return null ;
2067
2095
}
2096
+
2097
+ private function getClasses (Definition $ definition ): array
2098
+ {
2099
+ $ classes = [];
2100
+
2101
+ while ($ definition instanceof Definition) {
2102
+ $ classes [] = trim ($ definition ->getClass (), '\\' );
2103
+ $ factory = $ definition ->getFactory ();
2104
+
2105
+ if (!\is_array ($ factory )) {
2106
+ $ factory = [$ factory ];
2107
+ }
2108
+
2109
+ if (\is_string ($ factory [0 ])) {
2110
+ if (false !== $ i = strrpos ($ factory [0 ], ':: ' )) {
2111
+ $ factory [0 ] = substr ($ factory [0 ], 0 , $ i );
2112
+ }
2113
+ $ classes [] = trim ($ factory [0 ], '\\' );
2114
+ }
2115
+
2116
+ $ definition = $ factory [0 ];
2117
+ }
2118
+
2119
+ return array_filter ($ classes );
2120
+ }
2068
2121
}
0 commit comments