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

时间:2018-04-17 09:20:51

标签: 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

与此同时,我可以使用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之间有什么区别,它们是否完全相同?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

如Alister Bulman所解释的,

bind用于更全面的方法。但是,当在类定义上使用时,bindarguments或多或少相同。

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

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

arguments也优先于bind

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

答案 2 :(得分:1)

要添加的另一件事-绑定用于“按名称或类型绑定参数”,也可以在一次加载多个服务时使用-https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type

edit:您也可以在多个服务定义中使用参数,但是它将这些参数“强制注入”到所有实例化的服务中。所有参数都必须在所有服务中接受,而bind则按需注入。