Symfony 手动连接参数 - “参数”与“绑定”

Dan*_*ler 8 php symfony symfony4

我试图弄清楚如何手动注入参数DefaultController(没有自动装配)。我发现有两种方法可以实现这一目标。

我可以使用arguments

services:
    _defaults:
        autowire: false
        autoconfigure: true
        public: true

    App\Service\SomeService: ~

    App\Controller\DefaultController:
        arguments:                                    #!
            $service: '@App\Service\SomeService'
            $scalar: 22
Run Code Online (Sandbox Code Playgroud)

与此同时,我可以使用bind密钥:

services:
    _defaults:
        autowire: false
        autoconfigure: true
        public: true

    App\Service\SomeService: ~

    App\Controller\DefaultController:
        bind:                                         #!
            $service: '@App\Service\SomeService'
            $scalar: 22
Run Code Online (Sandbox Code Playgroud)

我的控制器:

class DefaultController extends Controller
{
    public function __construct($service, $scalar)
    {
        var_dump(get_class($service), $scalar);
    }
...
Run Code Online (Sandbox Code Playgroud)

这两个选项产生相同的输出:

string(23) "App\Service\SomeService" int(22)

那么究竟是什么这两个配置项之间的差异argumentsbind,他们做同样的事情?

Ali*_*man 6

bind通常在该_defaults部分中用于替换由该文件定义的服务中的任何匹配参数名称。

因此,从第二个示例中获取变量名称,并将它们放入更常见的_defaults:节中

_defaults:
    # autowire / autoconfig, etc
    bind:                                         #!
        $service: '@App\Service\SomeService'
        $scalar: 22
Run Code Online (Sandbox Code Playgroud)

任何具有这些变量名称的服务都将替换(除非在本地覆盖)服务或标量值 (22)。

  • 根据绑定链接中的注释,绑定变量将传递到您的任何操作以及构造函数中。所以我认为对给定服务使用 bind 是一种特殊情况,因为只有控制器支持动作注入。我没有绑定它,但我也猜测绑定特定服务将允许覆盖 _default 绑定。哈利波特会很自豪的。 (3认同)
  • 我也想过这个问题,但我不确定。阅读文档,有时我会找到带有 [`bind`](https://symfony.com/doc/current/controller.html#fetching-services) 的示例(这里它不在 `_defaults` 部分中),有时还带有`论据`。我觉得不一致。如果“arguments”不能在“_defaults”中使用并且“bind”可以在任何地方使用,那么为什么我们还需要“arguments” (2认同)