Symfony 手动连接参数 - 'arguments' vs 'bind'

Symfony manually wiring arguments - 'arguments' vs 'bind'

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

我可以使用 arguments:

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

    App\Service\SomeService: ~

    App\Controller\DefaultController:
        arguments:                                    #!
            $service: '@App\Service\SomeService'
            $scalar: 22

除此之外,我还可以使用 bind 键:

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

    App\Service\SomeService: ~

    App\Controller\DefaultController:
        bind:                                         #!
            $service: '@App\Service\SomeService'
            $scalar: 22

我的控制器:

class DefaultController extends Controller
{
    public function __construct($service, $scalar)
    {
        var_dump(get_class($service), $scalar);
    }
...

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

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

那么这两个配置键 argumentsbind 有什么区别,它们做的事情完全一样吗?

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

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

_defaults:
    # autowire / autoconfig, etc
    bind:                                         #!
        $service: '@App\Service\SomeService'
        $scalar: 22

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

bind 用于更全局的方法,正如 Alister Bulman 所解释的那样。但是当用于 class 定义时,bindarguments 或多或少是相同的。

我看到的唯一区别是 arguments 更灵活并且接受数组:

App\Controller\DefaultController:
    arguments:
        - '@App\Service\SomeService'
        - 22

arguments 也优先于 bind.

我猜文档不一致,因为 bind 相对较新。

还有一点要补充 - 绑定用于 "bind arguments by name or type" 并且也可以在一次加载多个服务时使用 - https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type .

编辑:您也可以在多个服务定义中使用参数,但它 "force injects" 所有实例化服务的参数,即。所有参数都必须在所有服务中接受,而绑定按需注入。