@@ -29,6 +29,9 @@ abstract class FileLoader extends BaseFileLoader
2929 protected $ container ;
3030 protected $ isLoadingInstanceof = false ;
3131 protected $ instanceof = [];
32+ protected $ interfaces = [];
33+ protected $ singlyImplemented = [];
34+ protected $ singlyImplementedAliases = [];
3235
3336 public function __construct (ContainerBuilder $ container , FileLocatorInterface $ locator )
3437 {
@@ -57,12 +60,10 @@ public function registerClasses(Definition $prototype, $namespace, $resource, $e
5760 $ classes = $ this ->findClasses ($ namespace , $ resource , (array ) $ exclude );
5861 // prepare for deep cloning
5962 $ serializedPrototype = serialize ($ prototype );
60- $ interfaces = [];
61- $ singlyImplemented = [];
6263
6364 foreach ($ classes as $ class => $ errorMessage ) {
6465 if (interface_exists ($ class , false )) {
65- $ interfaces [] = $ class ;
66+ $ this -> interfaces [] = $ class ;
6667 } else {
6768 $ this ->setDefinition ($ class , $ definition = unserialize ($ serializedPrototype ));
6869 if (null !== $ errorMessage ) {
@@ -71,14 +72,17 @@ public function registerClasses(Definition $prototype, $namespace, $resource, $e
7172 continue ;
7273 }
7374 foreach (class_implements ($ class , false ) as $ interface ) {
74- $ singlyImplemented [$ interface ] = isset ($ singlyImplemented [$ interface ]) ? false : $ class ;
75+ $ this -> singlyImplemented [$ interface ] = isset ($ this -> singlyImplemented [$ interface ]) ? false : $ class ;
7576 }
7677 }
7778 }
78- foreach ($ interfaces as $ interface ) {
79- if (!empty ($ singlyImplemented [$ interface ])) {
80- $ this ->container ->setAlias ($ interface , $ singlyImplemented [$ interface ])
81- ->setPublic (false );
79+
80+ foreach ($ this ->interfaces as $ interface ) {
81+ if (!empty ($ this ->singlyImplemented [$ interface ]) && !$ this ->container ->hasAlias ($ interface )) {
82+ $ this ->container ->setAlias ($ interface , $ this ->singlyImplemented [$ interface ])->setPublic (false );
83+ $ this ->singlyImplementedAliases [$ interface ] = true ;
84+ } elseif ($ this ->singlyImplementedAliases [$ interface ] ?? false ) {
85+ $ this ->container ->removeAlias ($ interface );
8286 }
8387 }
8488 }
0 commit comments