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' |