Contributed by
Nicolas Grekas
in #21494.
使用 Symfony程序的autowiring(自动关联) 时的一个最常见问题是,有两个或更多的服务,实现的是同一接口。autowiring系统无法猜出在每一种情况下用的是哪一个,这会导致你见到这种错误:
1 2 | [Symfony\Component\DependencyInjection\Exception\RuntimeException]
Unable to autowire argument of type "..." for the service "...". |
这一问题通过使用 autowiring_types
选项来定义“哪个(服务)是将要使用的默认实现”得以解决:
1 2 3 4 5 6 7 | # app/config/services.yml
services:
annotations.reader:
class: Doctrine\Common\Annotations\AnnotationReader
autowiring-type: Doctrine\Common\Annotations\Reader
public: false
# ... |
在Symfony 3.3我们决定简化此功能,进而 autowiring-types are now deprecated(自动关联类型不建议使用)。取而代之的是你必须使用 service aliases(服务的假名):
1 2 3 4 5 6 7 8 9 | # app/config/services.yml
services:
annotations.reader:
class: Doctrine\Common\Annotations\AnnotationReader
public: false
Doctrine\Common\Annotations\Reader:
alias: annotations.reader
public: false |
推荐把新的服务假名创建为private,因为你不需要在编译后的容器中可用。