@@ -72,6 +72,7 @@ class PhpDumper extends Dumper
72
72
private $ namespace ;
73
73
private $ asFiles ;
74
74
private $ hotPathTag ;
75
+ private $ inlineFactories ;
75
76
private $ inlineRequires ;
76
77
private $ inlinedRequires = [];
77
78
private $ circularReferences = [];
@@ -134,6 +135,7 @@ public function dump(array $options = [])
134
135
'as_files ' => false ,
135
136
'debug ' => true ,
136
137
'hot_path_tag ' => 'container.hot_path ' ,
138
+ 'inline_factories_parameter ' => 'container.dumper.inline_factories ' ,
137
139
'inline_class_loader_parameter ' => 'container.dumper.inline_class_loader ' ,
138
140
'service_locator_tag ' => 'container.service_locator ' ,
139
141
'build_time ' => time (),
@@ -143,6 +145,7 @@ public function dump(array $options = [])
143
145
$ this ->namespace = $ options ['namespace ' ];
144
146
$ this ->asFiles = $ options ['as_files ' ];
145
147
$ this ->hotPathTag = $ options ['hot_path_tag ' ];
148
+ $ this ->inlineFactories = $ this ->asFiles && $ options ['inline_factories_parameter ' ] && $ this ->container ->hasParameter ($ options ['inline_factories_parameter ' ]) && $ this ->container ->getParameter ($ options ['inline_factories_parameter ' ]);
146
149
$ this ->inlineRequires = $ options ['inline_class_loader_parameter ' ] && $ this ->container ->hasParameter ($ options ['inline_class_loader_parameter ' ]) && $ this ->container ->getParameter ($ options ['inline_class_loader_parameter ' ]);
147
150
$ this ->serviceLocatorTag = $ options ['service_locator_tag ' ];
148
151
@@ -215,6 +218,8 @@ public function dump(array $options = [])
215
218
}
216
219
}
217
220
221
+ $ proxyClasses = $ this ->generateProxyClasses ();
222
+
218
223
$ code =
219
224
$ this ->startClass ($ options ['class ' ], $ baseClass , $ baseClassWithNamespace ).
220
225
$ this ->addServices ($ services ).
@@ -258,13 +263,24 @@ public function dump(array $options = [])
258
263
$ files ['removed-ids.php ' ] = $ c .= "]; \n" ;
259
264
}
260
265
261
- foreach ($ this ->generateServiceFiles ($ services ) as $ file => $ c ) {
262
- $ files [$ file ] = $ fileStart .$ c ;
266
+ if (!$ this ->inlineFactories ) {
267
+ foreach ($ this ->generateServiceFiles ($ services ) as $ file => $ c ) {
268
+ $ files [$ file ] = $ fileStart .$ c ;
269
+ }
270
+ foreach ($ proxyClasses as $ file => $ c ) {
271
+ $ files [$ file ] = "<?php \n" .$ c ;
272
+ }
263
273
}
264
- foreach ($ this ->generateProxyClasses () as $ file => $ c ) {
265
- $ files [$ file ] = "<?php \n" .$ c ;
274
+
275
+ $ code .= $ this ->endClass ();
276
+
277
+ if ($ this ->inlineFactories ) {
278
+ foreach ($ proxyClasses as $ c ) {
279
+ $ code .= $ c ;
280
+ }
266
281
}
267
- $ files [$ options ['class ' ].'.php ' ] = $ code .$ this ->endClass ();
282
+
283
+ $ files [$ options ['class ' ].'.php ' ] = $ code ;
268
284
$ hash = ucfirst (strtr (ContainerBuilder::hash ($ files ), '._ ' , 'xx ' ));
269
285
$ code = [];
270
286
@@ -303,7 +319,7 @@ public function dump(array $options = [])
303
319
EOF ;
304
320
} else {
305
321
$ code .= $ this ->endClass ();
306
- foreach ($ this -> generateProxyClasses () as $ c ) {
322
+ foreach ($ proxyClasses as $ c ) {
307
323
$ code .= $ c ;
308
324
}
309
325
}
@@ -422,8 +438,9 @@ private function collectLineage($class, array &$lineage)
422
438
$ lineage [$ class ] = substr ($ exportedFile , 1 , -1 );
423
439
}
424
440
425
- private function generateProxyClasses ()
441
+ private function generateProxyClasses (): array
426
442
{
443
+ $ proxyClasses = [];
427
444
$ alreadyGenerated = [];
428
445
$ definitions = $ this ->container ->getDefinitions ();
429
446
$ strip = '' === $ this ->docStar && method_exists ('Symfony\Component\HttpKernel\Kernel ' , 'stripComments ' );
@@ -442,19 +459,39 @@ private function generateProxyClasses()
442
459
if ("\n" === $ proxyCode = "\n" .$ proxyDumper ->getProxyCode ($ definition )) {
443
460
continue ;
444
461
}
462
+
463
+ if ($ this ->inlineRequires ) {
464
+ $ lineage = [];
465
+ $ this ->collectLineage ($ class , $ lineage );
466
+
467
+ $ code = '' ;
468
+ foreach (array_diff_key (array_flip ($ lineage ), $ this ->inlinedRequires ) as $ file => $ class ) {
469
+ if ($ this ->inlineFactories ) {
470
+ $ this ->inlinedRequires [$ file ] = true ;
471
+ }
472
+ $ file = preg_replace ('#^ \\$this->targetDirs\[(\d++)\]# ' , sprintf ('\dirname(__DIR__, %d + $1) ' , $ this ->asFiles ), $ file );
473
+ $ code .= sprintf ("include_once %s; \n" , $ file );
474
+ }
475
+
476
+ $ proxyCode = $ code .$ proxyCode ;
477
+ }
478
+
445
479
if ($ strip ) {
446
480
$ proxyCode = "<?php \n" .$ proxyCode ;
447
481
$ proxyCode = substr (Kernel::stripComments ($ proxyCode ), 5 );
448
482
}
449
- yield sprintf ('%s.php ' , explode (' ' , $ proxyCode , 3 )[1 ]) => $ proxyCode ;
483
+
484
+ $ proxyClasses [sprintf ('%s.php ' , explode (' ' , $ proxyCode , 3 )[1 ])] = $ proxyCode ;
450
485
}
486
+
487
+ return $ proxyClasses ;
451
488
}
452
489
453
490
private function addServiceInclude (string $ cId , Definition $ definition ): string
454
491
{
455
492
$ code = '' ;
456
493
457
- if ($ this ->inlineRequires && !$ this ->isHotPath ($ definition )) {
494
+ if ($ this ->inlineRequires && ( !$ this ->isHotPath ($ definition) || $ this -> getProxyDumper ()-> isProxyCandidate ( $ definition ) )) {
458
495
$ lineage = [];
459
496
foreach ($ this ->inlinedDefinitions as $ def ) {
460
497
if (!$ def ->isDeprecated () && \is_string ($ class = \is_array ($ factory = $ def ->getFactory ()) && \is_string ($ factory [0 ]) ? $ factory [0 ] : $ def ->getClass ())) {
@@ -685,7 +722,7 @@ private function addService(string $id, Definition $definition): array
685
722
$ lazyInitialization = '' ;
686
723
}
687
724
688
- $ asFile = $ this ->asFiles && !$ this ->isHotPath ($ definition );
725
+ $ asFile = $ this ->asFiles && !$ this ->inlineFactories && ! $ this -> isHotPath ($ definition );
689
726
$ methodName = $ this ->generateMethodName ($ id );
690
727
if ($ asFile ) {
691
728
$ file = $ methodName .'.php ' ;
@@ -711,17 +748,16 @@ protected function {$methodName}($lazyInitialization)
711
748
$ this ->serviceCalls = [];
712
749
$ this ->inlinedDefinitions = $ this ->getDefinitionsFromArguments ([$ definition ], null , $ this ->serviceCalls );
713
750
714
- $ code .= $ this ->addServiceInclude ($ id , $ definition );
751
+ if ($ definition ->isDeprecated ()) {
752
+ $ code .= sprintf (" @trigger_error(%s, E_USER_DEPRECATED); \n\n" , $ this ->export ($ definition ->getDeprecationMessage ($ id )));
753
+ }
715
754
716
755
if ($ this ->getProxyDumper ()->isProxyCandidate ($ definition )) {
717
756
$ factoryCode = $ asFile ? ($ definition ->isShared () ? "\$this->load('%s.php', false) " : '$this->factories[%2$s](false) ' ) : '$this->%s(false) ' ;
718
757
$ code .= $ this ->getProxyDumper ()->getProxyFactoryCode ($ definition , $ id , sprintf ($ factoryCode , $ methodName , $ this ->doExport ($ id )));
719
758
}
720
759
721
- if ($ definition ->isDeprecated ()) {
722
- $ code .= sprintf (" @trigger_error(%s, E_USER_DEPRECATED); \n\n" , $ this ->export ($ definition ->getDeprecationMessage ($ id )));
723
- }
724
-
760
+ $ code .= $ this ->addServiceInclude ($ id , $ definition );
725
761
$ code .= $ this ->addInlineService ($ id , $ definition );
726
762
727
763
if ($ asFile ) {
@@ -1024,7 +1060,7 @@ public function __construct()
1024
1060
1025
1061
$ code .= $ this ->addSyntheticIds ();
1026
1062
$ code .= $ this ->addMethodMap ();
1027
- $ code .= $ this ->asFiles ? $ this ->addFileMap () : '' ;
1063
+ $ code .= $ this ->asFiles && ! $ this -> inlineFactories ? $ this ->addFileMap () : '' ;
1028
1064
$ code .= $ this ->addAliases ();
1029
1065
$ code .= $ this ->addInlineRequires ();
1030
1066
$ code .= <<<EOF
@@ -1043,7 +1079,7 @@ public function isCompiled()
1043
1079
EOF ;
1044
1080
$ code .= $ this ->addRemovedIds ();
1045
1081
1046
- if ($ this ->asFiles ) {
1082
+ if ($ this ->asFiles && ! $ this -> inlineFactories ) {
1047
1083
$ code .= <<<EOF
1048
1084
1049
1085
protected function load( \$file, \$lazyLoad = true)
@@ -1059,10 +1095,10 @@ protected function load(\$file, \$lazyLoad = true)
1059
1095
if (!$ proxyDumper ->isProxyCandidate ($ definition )) {
1060
1096
continue ;
1061
1097
}
1062
- if ($ this ->asFiles ) {
1098
+ if ($ this ->asFiles && ! $ this -> inlineFactories ) {
1063
1099
$ proxyLoader = '$this->load("{$class}.php") ' ;
1064
- } elseif ($ this ->namespace ) {
1065
- $ proxyLoader = 'class_alias(" ' . $ this -> namespace . ' \\\\{ $class} ", $class, false) ' ;
1100
+ } elseif ($ this ->namespace || $ this -> inlineFactories ) {
1101
+ $ proxyLoader = 'class_alias(__NAMESPACE__." \\\\$class", $class, false) ' ;
1066
1102
} else {
1067
1103
$ proxyLoader = '' ;
1068
1104
}
@@ -1140,7 +1176,7 @@ private function addMethodMap(): string
1140
1176
$ definitions = $ this ->container ->getDefinitions ();
1141
1177
ksort ($ definitions );
1142
1178
foreach ($ definitions as $ id => $ definition ) {
1143
- if (!$ definition ->isSynthetic () && $ definition ->isPublic () && (!$ this ->asFiles || $ this ->isHotPath ($ definition ))) {
1179
+ if (!$ definition ->isSynthetic () && $ definition ->isPublic () && (!$ this ->asFiles || $ this ->inlineFactories || $ this -> isHotPath ($ definition ))) {
1144
1180
$ code .= ' ' .$ this ->doExport ($ id ).' => ' .$ this ->doExport ($ this ->generateMethodName ($ id )).", \n" ;
1145
1181
}
1146
1182
}
@@ -1237,6 +1273,11 @@ private function addInlineRequires(): string
1237
1273
1238
1274
foreach ($ this ->container ->findTaggedServiceIds ($ this ->hotPathTag ) as $ id => $ tags ) {
1239
1275
$ definition = $ this ->container ->getDefinition ($ id );
1276
+
1277
+ if ($ this ->getProxyDumper ()->isProxyCandidate ($ definition )) {
1278
+ continue ;
1279
+ }
1280
+
1240
1281
$ inlinedDefinitions = $ this ->getDefinitionsFromArguments ([$ definition ]);
1241
1282
1242
1283
foreach ($ inlinedDefinitions as $ def ) {
@@ -1578,7 +1619,7 @@ private function dumpValue($value, bool $interpolate = true): string
1578
1619
continue ;
1579
1620
}
1580
1621
$ definition = $ this ->container ->findDefinition ($ id = (string ) $ v );
1581
- $ load = !($ definition ->hasErrors () && $ e = $ definition ->getErrors ()) ? $ this ->asFiles && !$ this ->isHotPath ($ definition ) : reset ($ e );
1622
+ $ load = !($ definition ->hasErrors () && $ e = $ definition ->getErrors ()) ? $ this ->asFiles && !$ this ->inlineFactories && ! $ this -> isHotPath ($ definition ) : reset ($ e );
1582
1623
$ serviceMap .= sprintf ("\n %s => [%s, %s, %s, %s], " ,
1583
1624
$ this ->export ($ k ),
1584
1625
$ this ->export ($ definition ->isShared () ? ($ definition ->isPublic () ? 'services ' : 'privates ' ) : false ),
@@ -1716,7 +1757,7 @@ private function getServiceCall(string $id, Reference $reference = null): string
1716
1757
$ code = sprintf ('$this->%s[%s] = %s ' , $ definition ->isPublic () ? 'services ' : 'privates ' , $ this ->doExport ($ id ), $ code );
1717
1758
}
1718
1759
$ code = "( $ code) " ;
1719
- } elseif ($ this ->asFiles && !$ this ->isHotPath ($ definition )) {
1760
+ } elseif ($ this ->asFiles && !$ this ->inlineFactories && ! $ this -> isHotPath ($ definition )) {
1720
1761
$ code = sprintf ("\$this->load('%s.php') " , $ this ->generateMethodName ($ id ));
1721
1762
if (!$ definition ->isShared ()) {
1722
1763
$ factory = sprintf ('$this->factories%s[%s] ' , $ definition ->isPublic () ? '' : "['service_container'] " , $ this ->doExport ($ id ));
0 commit comments