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');
// ...
}
} |