@@ -33,6 +33,7 @@ class AutowirePass extends AbstractRecursivePass
33
33
{
34
34
private $ types ;
35
35
private $ ambiguousServiceTypes ;
36
+ private $ autowiringAliases ;
36
37
private $ lastFailure ;
37
38
private $ throwOnAutowiringException ;
38
39
private $ decoratedClass ;
@@ -343,10 +344,15 @@ private function populateAvailableTypes(ContainerBuilder $container)
343
344
{
344
345
$ this ->types = [];
345
346
$ this ->ambiguousServiceTypes = [];
347
+ $ this ->autowiringAliases = [];
346
348
347
349
foreach ($ container ->getDefinitions () as $ id => $ definition ) {
348
350
$ this ->populateAvailableType ($ container , $ id , $ definition );
349
351
}
352
+
353
+ foreach ($ container ->getAliases () as $ id => $ alias ) {
354
+ $ this ->populateAutowiringAlias ($ id );
355
+ }
350
356
}
351
357
352
358
/**
@@ -370,6 +376,8 @@ private function populateAvailableType(ContainerBuilder $container, string $id,
370
376
do {
371
377
$ this ->set ($ reflectionClass ->name , $ id );
372
378
} while ($ reflectionClass = $ reflectionClass ->getParentClass ());
379
+
380
+ $ this ->populateAutowiringAlias ($ id );
373
381
}
374
382
375
383
/**
@@ -459,6 +467,10 @@ private function createTypeAlternatives(ContainerBuilder $container, TypedRefere
459
467
}
460
468
461
469
$ servicesAndAliases = $ container ->getServiceIds ();
470
+ if (null !== ($ autowiringAliases = $ this ->autowiringAliases [$ type ] ?? null ) && !isset ($ autowiringAliases ['' ])) {
471
+ return sprintf (' Available autowiring aliases for this %s are: "$%s". ' , class_exists ($ type , false ) ? 'class ' : 'interface ' , implode ('", "$ ' , $ autowiringAliases ));
472
+ }
473
+
462
474
if (!$ container ->has ($ type ) && false !== $ key = array_search (strtolower ($ type ), array_map ('strtolower ' , $ servicesAndAliases ))) {
463
475
return sprintf (' Did you mean "%s"? ' , $ servicesAndAliases [$ key ]);
464
476
} elseif (isset ($ this ->ambiguousServiceTypes [$ type ])) {
@@ -497,4 +509,18 @@ private function getAliasesSuggestionForType(ContainerBuilder $container, string
497
509
498
510
return null ;
499
511
}
512
+
513
+ private function populateAutowiringAlias (string $ id ): void
514
+ {
515
+ if (!preg_match ('/(?(DEFINE)(?<V>[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+))^((?&V)(?: \\\\(?&V))*+)(?: \$((?&V)))?$/ ' , $ id , $ m )) {
516
+ return ;
517
+ }
518
+
519
+ $ type = $ m [2 ];
520
+ $ name = $ m [3 ] ?? '' ;
521
+
522
+ if (class_exists ($ type , false ) || interface_exists ($ type , false )) {
523
+ $ this ->autowiringAliases [$ type ][$ name ] = $ name ;
524
+ }
525
+ }
500
526
}
0 commit comments