@@ -80,6 +80,7 @@ class PhpDumper extends Dumper
80
80
private $ inlinedRequires = [];
81
81
private $ circularReferences = [];
82
82
private $ singleUsePrivateIds = [];
83
+ private $ preload = [];
83
84
private $ addThrow = false ;
84
85
private $ addGetService = false ;
85
86
private $ locatedIds = [];
@@ -141,6 +142,7 @@ public function dump(array $options = [])
141
142
'hot_path_tag ' => 'container.hot_path ' ,
142
143
'inline_factories_parameter ' => 'container.dumper.inline_factories ' ,
143
144
'inline_class_loader_parameter ' => 'container.dumper.inline_class_loader ' ,
145
+ 'preload_classes ' => [],
144
146
'service_locator_tag ' => 'container.service_locator ' ,
145
147
'build_time ' => time (),
146
148
], $ options );
@@ -225,8 +227,12 @@ public function dump(array $options = [])
225
227
226
228
$ proxyClasses = $ this ->inlineFactories ? $ this ->generateProxyClasses () : null ;
227
229
230
+ if ($ options ['preload_classes ' ]) {
231
+ $ this ->preload = array_combine ($ options ['preload_classes ' ], $ options ['preload_classes ' ]);
232
+ }
233
+
228
234
$ code =
229
- $ this ->startClass ($ options ['class ' ], $ baseClass, $ preload ).
235
+ $ this ->startClass ($ options ['class ' ], $ baseClass ).
230
236
$ this ->addServices ($ services ).
231
237
$ this ->addDeprecatedAliases ().
232
238
$ this ->addDefaultParametersMethod ()
@@ -301,7 +307,7 @@ public function dump(array $options = [])
301
307
$ id = hash ('crc32 ' , $ hash .$ time );
302
308
$ this ->asFiles = false ;
303
309
304
- if ($ preload && null !== $ autoloadFile = $ this ->getAutoloadFile ()) {
310
+ if ($ this -> preload && null !== $ autoloadFile = $ this ->getAutoloadFile ()) {
305
311
$ autoloadFile = substr ($ this ->export ($ autoloadFile ), 2 , -1 );
306
312
307
313
$ code [$ options ['class ' ].'.preload.php ' ] = <<<EOF
@@ -319,8 +325,10 @@ public function dump(array $options = [])
319
325
320
326
EOF ;
321
327
322
- foreach ($ preload as $ class ) {
323
- $ code [$ options ['class ' ].'.preload.php ' ] .= sprintf ("\$classes[] = '%s'; \n" , $ class );
328
+ foreach ($ this ->preload as $ class ) {
329
+ if ($ class && (!(class_exists ($ class , false ) || interface_exists ($ class , false ) || trait_exists ($ class , false )) || (new \ReflectionClass ($ class ))->isUserDefined ())) {
330
+ $ code [$ options ['class ' ].'.preload.php ' ] .= sprintf ("\$classes[] = '%s'; \n" , $ class );
331
+ }
324
332
}
325
333
326
334
$ code [$ options ['class ' ].'.preload.php ' ] .= <<<'EOF'
@@ -366,6 +374,7 @@ public function dump(array $options = [])
366
374
$ this ->circularReferences = [];
367
375
$ this ->locatedIds = [];
368
376
$ this ->exportedVariables = [];
377
+ $ this ->preload = [];
369
378
370
379
$ unusedEnvs = [];
371
380
foreach ($ this ->container ->getEnvCounters () as $ env => $ use ) {
@@ -541,8 +550,13 @@ private function addServiceInclude(string $cId, Definition $definition): string
541
550
if ($ this ->inlineRequires && (!$ this ->isHotPath ($ definition ) || $ this ->getProxyDumper ()->isProxyCandidate ($ definition ))) {
542
551
$ lineage = [];
543
552
foreach ($ this ->inlinedDefinitions as $ def ) {
544
- if (!$ def ->isDeprecated () && \is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())) {
545
- $ this ->collectLineage ($ class , $ lineage );
553
+ if (!$ def ->isDeprecated ()) {
554
+ if ($ class = $ this ->getFactoryClass ($ def )) {
555
+ $ this ->collectLineage ($ class , $ lineage );
556
+ }
557
+ if ($ class = $ def ->getClass ()) {
558
+ $ this ->collectLineage ($ class , $ lineage );
559
+ }
546
560
}
547
561
}
548
562
@@ -551,9 +565,13 @@ private function addServiceInclude(string $cId, Definition $definition): string
551
565
&& ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE !== $ behavior
552
566
&& $ this ->container ->has ($ id )
553
567
&& $ this ->isTrivialInstance ($ def = $ this ->container ->findDefinition ($ id ))
554
- && \is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())
555
568
) {
556
- $ this ->collectLineage ($ class , $ lineage );
569
+ if ($ class = $ this ->getFactoryClass ($ def )) {
570
+ $ this ->collectLineage ($ class , $ lineage );
571
+ }
572
+ if ($ class = $ def ->getClass ()) {
573
+ $ this ->collectLineage ($ class , $ lineage );
574
+ }
557
575
}
558
576
}
559
577
@@ -798,6 +816,15 @@ protected function {$methodName}($lazyInitialization)
798
816
799
817
if ($ definition ->isDeprecated ()) {
800
818
$ code .= sprintf (" @trigger_error(%s, E_USER_DEPRECATED); \n\n" , $ this ->export ($ definition ->getDeprecationMessage ($ id )));
819
+ } else {
820
+ foreach ($ this ->inlinedDefinitions as $ def ) {
821
+ if ($ class = $ this ->getFactoryClass ($ def )) {
822
+ $ this ->preload [$ class ] = $ class ;
823
+ }
824
+ if ($ class = ltrim ($ def ->getClass (), '\\' )) {
825
+ $ this ->preload [$ class ] = $ class ;
826
+ }
827
+ }
801
828
}
802
829
803
830
if ($ this ->getProxyDumper ()->isProxyCandidate ($ definition )) {
@@ -953,7 +980,18 @@ private function addServices(array &$services = null): string
953
980
$ definitions = $ this ->container ->getDefinitions ();
954
981
ksort ($ definitions );
955
982
foreach ($ definitions as $ id => $ definition ) {
956
- $ services [$ id ] = $ definition ->isSynthetic () ? null : $ this ->addService ($ id , $ definition );
983
+ if (!$ definition ->isSynthetic ()) {
984
+ $ services [$ id ] = $ this ->addService ($ id , $ definition );
985
+ } else {
986
+ $ services [$ id ] = null ;
987
+
988
+ if ($ class = $ this ->getFactoryClass ($ definition )) {
989
+ $ this ->preload [$ class ] = $ class ;
990
+ }
991
+ if ($ class = ltrim ($ definition ->getClass (), '\\' )) {
992
+ $ this ->preload [$ class ] = $ class ;
993
+ }
994
+ }
957
995
}
958
996
959
997
foreach ($ definitions as $ id => $ definition ) {
@@ -1054,7 +1092,7 @@ private function addNewInstance(Definition $definition, string $return = '', str
1054
1092
return $ return .sprintf ('new %s(%s) ' , $ this ->dumpLiteralClass ($ this ->dumpValue ($ class )), implode (', ' , $ arguments )).$ tail ;
1055
1093
}
1056
1094
1057
- private function startClass (string $ class , string $ baseClass, ? array & $ preload ): string
1095
+ private function startClass (string $ class , string $ baseClass ): string
1058
1096
{
1059
1097
$ namespaceLine = !$ this ->asFiles && $ this ->namespace ? "\nnamespace {$ this ->namespace }; \n" : '' ;
1060
1098
@@ -1117,7 +1155,7 @@ public function __construct()
1117
1155
$ code .= $ this ->addMethodMap ();
1118
1156
$ code .= $ this ->asFiles && !$ this ->inlineFactories ? $ this ->addFileMap () : '' ;
1119
1157
$ code .= $ this ->addAliases ();
1120
- $ code .= $ this ->addInlineRequires ($ preload );
1158
+ $ code .= $ this ->addInlineRequires ();
1121
1159
$ code .= <<<EOF
1122
1160
}
1123
1161
@@ -1317,7 +1355,7 @@ protected function {$methodNameAlias}()
1317
1355
return $ code ;
1318
1356
}
1319
1357
1320
- private function addInlineRequires (? array & $ preload ): string
1358
+ private function addInlineRequires (): string
1321
1359
{
1322
1360
if (!$ this ->hotPathTag || !$ this ->inlineRequires ) {
1323
1361
return '' ;
@@ -1335,8 +1373,10 @@ private function addInlineRequires(?array &$preload): string
1335
1373
$ inlinedDefinitions = $ this ->getDefinitionsFromArguments ([$ definition ]);
1336
1374
1337
1375
foreach ($ inlinedDefinitions as $ def ) {
1338
- if (\is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())) {
1339
- $ preload [$ class ] = $ class ;
1376
+ if ($ class = $ this ->getFactoryClass ($ def )) {
1377
+ $ this ->collectLineage ($ class , $ lineage );
1378
+ }
1379
+ if ($ class = $ def ->getClass ()) {
1340
1380
$ this ->collectLineage ($ class , $ lineage );
1341
1381
}
1342
1382
}
@@ -2058,4 +2098,17 @@ private function getAutoloadFile(): ?string
2058
2098
2059
2099
return null ;
2060
2100
}
2101
+
2102
+ private function getFactoryClass (Definition $ definition ): ?string
2103
+ {
2104
+ while ($ definition instanceof Definition && \is_array ($ factory = $ definition ->getFactory ())) {
2105
+ if (\is_string ($ factory [0 ])) {
2106
+ return ltrim ($ factory [0 ], '\\' );
2107
+ }
2108
+
2109
+ $ definition = $ factory [0 ];
2110
+ }
2111
+
2112
+ return null ;
2113
+ }
2061
2114
}
0 commit comments