架构与请求 · 第 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 是否复用实例。

认证与考试

下一个考试是什么?

已有 19 项考试可以练习,21 项正在投票中。查看所有认证及官方信息,投出你的一票,或推荐你的考试。

查看全部认证