Contributed by
Nicolas Grekas
in #25288.

使用了 autowiring 自动关联的 Symfony 程序可以去除其大多数的服务配置信息,而是基于参数的type-hinting(类型提示)来完成注入。此功能的一大例外,就是 scalar arguments(标量参数),例如某个服务在其构造器中需要用到 kernel.project_dir parameter 的值。

得益于 argument binding(参数绑定),解决办法十分简单,它能让你一次定义 scalar arguments 然后把它们作用到定义在相同配置文件中的全部服务之中:

1
2
3
4
5
6
# config/services.yaml
services:
    # ...
    _defaults:
        bind:
            $projectDir: '%kernel.project_dir%'

但是,如果某些特定的服务用到大量的容器参数(container parameters,极端情况下甚至用到全部容器参数),使用 argument binding 参数绑定就显得十分繁琐。在 Symfony 4.1 中我们添加了一个功能,收集全部的容器参数作为服务。你只需使用 ParameterBagInterface 类或是全新的 ContainerBagInterface 类(它遵循 PSR-11 标准)来对参数进行 type-hint 即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// src/Service/MessageGenerator.php
// ...
 
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
 
class MessageGenerator
{
    private $params;
 
    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }
 
    public function someMethod()
    {
        $parameterValue = $this->params->get('parameter_name');
        // ...
    }
}