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.

Certifications & examens

Quel examen pour la suite ?

Tu peux déjà t’entraîner pour 19 examens, 21 sont soumis au vote. Découvre toutes les certifications avec les infos officielles, vote ou propose ton examen.

Voir toutes les certifications