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,因为你不需要在编译后的容器中可用。