Architektur und Request · Frage 9 von 12
Ein Controller verlangt im Konstruktor ein GeocoderInterface. Die Extension enthält zwei Implementierungen, OpenStreetMapGeocoder und GoogleGeocoder. Der Container meldet einen Fehler. Wie legt man die Standard-Implementierung fest?
2 Antworten sind richtig. Mittel
Lösung anzeigen
Lösung
- A In der Services.yaml einen Alias anlegen: Vendor\
MyExt\ Geocoder\ GeocoderInterface: '@Vendor\ MyExt\ Geocoder\ OpenStreetMapGeocoder' - B Das Attribut #[AsAlias(GeocoderInterface::class)] an die Klasse OpenStreetMapGeocoder setzen
Erklärung
Gibt es genau eine Implementierung, verknüpft Symfony sie beim Laden der Klassen automatisch mit dem Interface. Bei zwei Kandidaten weiß der Container nicht, welchen er nehmen soll, und bricht ab. Ein Alias beantwortet genau diese Frage, entweder per #[AsAlias] (Symfony DependencyInjection) direkt an der Klasse oder in der Services.yaml. public: true macht einen Dienst nur von außen abrufbar, SingletonInterface steuert nur, ob makeInstance eine Instanz wiederverwendet.