@@ -212,6 +212,10 @@ public function has($name, $checkAbstractFactories = false)
212
212
* Valid top keys are:
213
213
*
214
214
* - services: service name => service instance pairs
215
+ * - invokables: service name => class name pairs for classes that do not
216
+ * have required constructor arguments; internally, maps the class to an
217
+ * InvokableFactory instance, and creates an alias if the service name
218
+ * and class name do not match.
215
219
* - factories: service name => factory pairs; factories may be any
216
220
* callable, string name resolving to an invokable class, or string name
217
221
* resolving to a FactoryInterface instance.
@@ -245,6 +249,21 @@ protected function configure(array $config)
245
249
$ this ->services = $ config ['services ' ] + $ this ->services ;
246
250
}
247
251
252
+ if (isset ($ config ['invokables ' ]) && ! empty ($ config ['invokables ' ])) {
253
+ $ aliases = $ this ->createAliasesForInvokables ($ config ['invokables ' ]);
254
+ $ factories = $ this ->createFactoriesForInvokables ($ config ['invokables ' ]);
255
+
256
+ if (! empty ($ aliases )) {
257
+ $ config ['aliases ' ] = (isset ($ config ['aliases ' ]))
258
+ ? array_merge ($ config ['aliases ' ], $ aliases )
259
+ : $ aliases ;
260
+ }
261
+
262
+ $ config ['factories ' ] = (isset ($ config ['factories ' ]))
263
+ ? array_merge ($ config ['factories ' ], $ factories )
264
+ : $ factories ;
265
+ }
266
+
248
267
if (isset ($ config ['factories ' ])) {
249
268
$ this ->factories = $ config ['factories ' ] + $ this ->factories ;
250
269
}
@@ -577,4 +596,50 @@ private function createLazyServiceDelegatorFactory()
577
596
578
597
return $ this ->lazyServicesDelegator ;
579
598
}
599
+
600
+ /**
601
+ * Create aliases for invokable classes.
602
+ *
603
+ * If an invokable service name does not match the class it maps to, this
604
+ * creates an alias to the class (which will later be mapped as an
605
+ * invokable factory).
606
+ *
607
+ * @param array $invokables
608
+ * @return array
609
+ */
610
+ private function createAliasesForInvokables (array $ invokables )
611
+ {
612
+ $ aliases = [];
613
+ foreach ($ invokables as $ name => $ class ) {
614
+ if ($ name === $ class ) {
615
+ continue ;
616
+ }
617
+ $ aliases [$ name ] = $ class ;
618
+ }
619
+ return $ aliases ;
620
+ }
621
+
622
+ /**
623
+ * Create invokable factories for invokable classes.
624
+ *
625
+ * If an invokable service name does not match the class it maps to, this
626
+ * creates an invokable factory entry for the class name; otherwise, it
627
+ * creates an invokable factory for the entry name.
628
+ *
629
+ * @param array $invokables
630
+ * @return array
631
+ */
632
+ private function createFactoriesForInvokables (array $ invokables )
633
+ {
634
+ $ factories = [];
635
+ foreach ($ invokables as $ name => $ class ) {
636
+ if ($ name === $ class ) {
637
+ $ factories [$ name ] = Factory \InvokableFactory::class;
638
+ continue ;
639
+ }
640
+
641
+ $ factories [$ class ] = Factory \InvokableFactory::class;
642
+ }
643
+ return $ factories ;
644
+ }
580
645
}
0 commit comments