Architecture et requête · Question 9 sur 12
Un contrôleur exige une GeocoderInterface dans son constructeur. L'extension contient deux implémentations, OpenStreetMapGeocoder et GoogleGeocoder. Le conteneur signale une erreur. Comment définir l'implémentation par défaut ?
2 réponses sont correctes. Moyen
Afficher la solution
Solution
- A Définir un alias dans Services.yaml : Vendor\
MyExt\ Geocoder\ GeocoderInterface: '@Vendor\ MyExt\ Geocoder\ OpenStreetMapGeocoder' - B Ajouter l'attribut #[AsAlias(GeocoderInterface::class)] à la classe OpenStreetMapGeocoder
Explication
S'il existe exactement une implémentation, Symfony la lie automatiquement à l'interface lors du chargement des classes. Avec deux candidates, le conteneur ne sait pas laquelle utiliser et s'arrête. Un alias répond exactement à cette question, soit avec #[AsAlias] (Symfony DependencyInjection) directement sur la classe, soit dans Services.yaml. public: true rend seulement un service récupérable depuis l'extérieur, et SingletonInterface détermine seulement si makeInstance réutilise une instance.