Contributed by
Nicolas Grekas
in #28234.

在最新的 Symfony 程序中,得益于 service autowiring(自动关联)和 service autoconfiguration(服务的自动配置),也就没有必要配置你的大多数 (或任何) 服务了。然而,在一些极端情况下你需要告诉 Symfony 究竟是哪个服务应当被注入到其他服务中。

这已经被 local binding(本地绑定)所解决,它允许利用 type 或 name 来绑定服务。例如,当你使用 YAML 来配置服务时:

1
2
3
4
5
6
7
8
9
10
11
12
13
# config/services.yaml
services:
    _defaults:
        bind:
            # pass this value to any $adminEmail argument for any service
            # that's defined in this file (including controller arguments)
            # 向在本文件中定义了 $adminEmail 参数的任何服务(包括controller参数)传递这个值
            $adminEmail: 'manager@example.com'
 
            # pass this service for any LoggerInterface type-hint for any
            # service that's defined in this file
            # 把这个服务,传给定义于本配置文件的任意一个具有 LoggerInterface 类型提示的服务
            Psr\Log\LoggerInterface: '@monolog.logger.request'

在 Symfony 4.2 我们优化了此功能,允许同时 利用类型和名称来绑定服务。此功能允许更加智能的绑定,因为它仅在参数类型和参数名称同时匹配的时候才进行绑定。

1
2
3
4
5
6
7
8
9
10
11
# config/services.yaml
services:
    _defaults:
        bind:
            # it works with scalar types too (string, int, array, etc.)
            # 也会在标量类型下生效(字符串/整型/数组等)
            string $adminEmail: 'manager@example.com'
 
            # but it's mostly used with classes
            # 但多数时候和类一起使用
            Psr\Log\LoggerInterface $requestLogger: '@monolog.logger.request'