架构与请求 · 第 9 题,共 12 题
一个控制器在构造函数中需要 GeocoderInterface。扩展包含两个实现:OpenStreetMapGeocoder 和 GoogleGeocoder。容器报错。如何定义默认实现?
有 2 个正确答案。 中等
显示答案
答案
- A 在 Services.yaml 中定义别名:Vendor\
MyExt\ Geocoder\ GeocoderInterface: '@Vendor\ MyExt\ Geocoder\ OpenStreetMapGeocoder' - B 给类 OpenStreetMapGeocoder 添加属性 #[AsAlias(GeocoderInterface::class)]
解析
如果恰好只有一个实现,Symfony 在加载类时会自动将其与接口关联。有两个候选时,容器不知道该用哪一个,于是中止。别名正好回答了这个问题,可以直接在类上使用 #[AsAlias](Symfony DependencyInjection),也可以写在 Services.yaml 中。public: true 只是让服务可以从外部获取,SingletonInterface 只控制 makeInstance 是否复用实例。